MVVM Light - 主/子视图和依赖项属性

时间:2010-04-19 11:10:33

标签: silverlight mvvm mvvm-light light

在实现主/子视图和自定义依赖项属性时,我遇到了一个奇怪的问题。

在我的masterView中,我在XAML中以声明方式绑定视图模型,如下所示:

 DataContext="{Binding MainViewModelProperty, Source={StaticResource Locator}}"

我的MainViewModel正在公开一个可观察的集合,我将它绑定到ItemsControl,如下所示:

        <ItemsControl ItemsSource="{Binding Lists}" Height="490" Canvas.Top="10" Width="70">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Canvas>
                    <local:TaskListControl Canvas.Left="{Binding ListLeft}" 
                                           Canvas.Top="{Binding ListTop}" 
                                           Width="{Binding ListWidth}" 
                                           Height="{Binding ListHeight}"
                                           ListDetails="{Binding}"/>
                    </Canvas>    
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>    

TaskListControl依次声明并绑定到它的ViewModel,我还为ListDetails属性定义了一个依赖属性。

未设置ListDetails属性,如果我删除对其viewmodel的声明性引用,则依赖属性的回调会被触发。

是否存在与声明性绑定到viewmodel和definig依赖属性的冲突?

我非常喜欢MVVM Light的可混合性,并希望坚持这个问题,所以任何帮助都会被提升。

如果您想收到我项目的来源,请询问

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你的问题,但让我们试着猜猜。当你谈到“声明性地绑定到viewmodel”时,你实际上是指“命令性地”,就像在“代码中”而不是“在XAML“?

如果是这种情况,那么您需要了解这将覆盖来自父级的DataContext继承,而ListDetails属性现在引用TaskListControl DataContext,而不再引用DataTemplate的DataContext。

这很容易改变,例如:

<ItemsControl ItemsSource="{Binding Lists}" 
              Height="490" 
              Canvas.Top="10" 
              Width="70">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Canvas x:Name="RootPanel">
                <local:TaskListControl Canvas.Left="{Binding ListLeft}" 
                                       Canvas.Top="{Binding ListTop}" 
                                       Width="{Binding ListWidth}" 
                                       Height="{Binding ListHeight}"
                                       ListDetails="{Binding ElementName=RootPanel, 
                                           Path=DataContext}"/>
            </Canvas>    
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

那会有用吗? 劳伦