4 Stimmen

Problem beim Binden von View an ViewModel mit DataTemplate

Ich habe vor kurzem begonnen, versuchen, Sinn von MVVM zu machen und bin mit der MvvmFoundation-Klassen. Ich versuche, ein DataTemplate für eine View Model-Klasse zu verwenden, um die Ansicht anzuzeigen. Der XAML-Code ist unten: TVM ist eine Eigenschaft des Typs TrackViewModel.

Die TrackView, die im Stack-Panel mit einem DataContext platziert wird, wird korrekt angezeigt. Die Version der Inhaltssteuerung wird als leeres TrackViewModel dargestellt.

<Window.Resources>
    <DataTemplate  DataType="{x:Type vm:TrackViewModel}" >
        <v:TrackView/>
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <ContentControl Width="200" Height="50" Content="{Binding Path=TVM, UpdateSourceTrigger=PropertyChanged}"/>
    <v:TrackView DataContext="{Binding TVM}"/>
</StackPanel>

Es scheint, dass ich eine Verknüpfung zwischen dem TrackView im DataTemplate und dem instansierten TrackViewModel, TVM, nicht eingerichtet habe. Folglich zeigen die PropertyChangedEventHandler für TrackViewModel als Null in der nicht funktionierenden Fall aber sind in Ordnung, wenn ich direkt den Datacontext festgelegt.

Jeder Gedanke ist sehr willkommen.

Die TrackView XAML sieht wie folgt aus:

<UserControl.DataContext>
    <vm:TrackViewModel/>
</UserControl.DataContext>

<UserControl.Resources>
    <LinearGradientBrush x:Key="barBackgroundBrush"  StartPoint="0,0" EndPoint="0,1" Opacity="0.7">
        <GradientStop Offset="0" Color="Blue"/>
        <GradientStop Offset="0.3" Color="Aquamarine"/>
        <GradientStop Offset="1" Color="Blue"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="barTrackingBrush"  StartPoint="0,0" EndPoint="0,1" Opacity="0.7">
        <GradientStop Offset="0" Color="Orange"/>
        <GradientStop Offset="0.3" Color="OrangeRed"/>
        <GradientStop Offset="1" Color="Orange"/>

    </LinearGradientBrush>

    <DataTemplate x:Key="RegionDataTemplate" >
        <Border CornerRadius="5" BorderThickness="3" Background="{StaticResource barTrackingBrush}" 
                    Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Canvas}}}"
                    Width="{Binding Path=Duration}">
            <Border.RenderTransform>
                <TranslateTransform X="{Binding Path=StartFrame}"/>
            </Border.RenderTransform>
        </Border>
    </DataTemplate>
       <UserControl.DataContext>
    <vm:TrackViewModel/>
</UserControl.DataContext>
</UserControl.Resources>

<StackPanel>
    <ItemsControl ItemsSource="{Binding Path=Regions, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{StaticResource RegionDataTemplate}" VerticalAlignment="Center">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas Background="{StaticResource barBackgroundBrush}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Panel}}}" VerticalAlignment="Stretch"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</StackPanel>

5voto

Abe Heidebrecht Punkte 29382

Da Sie die Einstellung DataContext で、その UserControl XAML, wird es nicht in der ContentControl Fall. Im zweiten Fall legen Sie ihn explizit fest, so dass er nicht mehr gilt, wenn er in der UserControl Erklärung. Wenn Sie diese löschen, kann die UserControl zu erben, die DataContext der ContentControl der der Inhalt ist, den Sie in der Datei Binding .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X