0

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

在我的 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 属性,如果我删除对其视图模型的声明性引用,则依赖属性的回调确实会被触发。

以声明方式绑定到视图模型和定义依赖属性是否存在冲突?

我真的很喜欢 MVVM Light 的可混合性,并希望能够解决这个问题,因此任何帮助都会受到赞赏。

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

4

1 回答 1

0

我不确定我是否完全理解您的问题,但让我们尝试猜测一下。当您谈论“以声明方式绑定到视图模型”时,您实际上是指“必须”,如“在代码中”而不是“在 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>

那行得通吗?洛朗

于 2010-04-23T09:35:20.420 回答