Проблема привязки View к ViewModel с помощью DataTemplate - PullRequest
4 голосов
/ 01 ноября 2010

Я недавно начал пытаться разобраться в MVVM и использую классы MvvmFoundation. Я пытаюсь использовать DataTemplate для класса View Model для отображения View. Код XAML приведен ниже: TVM является свойством типа TrackViewModel.

TrackView, размещенный на панели Stack с использованием DataContext, отображается правильно. Версия управления контентом отображается как пустая TrackViewModel.

<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>

Похоже, я не установил связь между TrackView в DataTemplate и созданной TrackViewModel, TVM. Следовательно, свойства PropertyChangedEventHandler для TrackViewModel отображаются как ноль в нерабочем случае, но это нормально, когда я непосредственно устанавливаю Datacontext.

Любые мысли с благодарностью.

TrackAM XAML выглядит следующим образом:

<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>

1 Ответ

5 голосов
/ 01 ноября 2010

Так как вы устанавливаете DataContext в UserControl XAML, он не будет наследоваться в случае ContentControl. Во втором случае вы устанавливаете его явно, что переопределит его, если оно задано в объявлении UserControl. Удаление этого позволит UserControl наследовать DataContext из ContentControl, который будет Контентом, установленным в Binding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...