WPF MVVM - 如果我将DataContext设置为后面的代码,自定义控件将不会绑定到Visibility

时间:2010-09-02 13:54:30

标签: wpf user-controls mvvm

我想对我的应用程序进行快速用户控制,但为了保持MVVM样式,我认为我将XAML的DataContext设置为我的UserControl中的代码。

DataContext="{Binding RelativeSource={RelativeSource Self}}"

这允许我将XAML绑定到我后面的代码中的属性。

在我将控件实例的Visibility绑定到ViewModel上的Visibility属性之前,一切顺利。

<Controls:RoundProgress Visibility="{Binding ProgressVisibility}" Width="100" Height="100"></Controls:RoundProgress>

可见性不再有效 - 如果我使用用户控件中的DataContext删除我的小叮当 - 可见性有效!

有人能帮我问好吗?感谢

2 个答案:

答案 0 :(得分:11)

不要从内部XAML设置UserControl本身的DataContext。通过这样做,您可以覆盖继承的DataContext,并使Binding在UC上查找ProgressVisibility属性,而不是ViewModel。而是将DataContext设置在UC中的元素上:

<UserControl x:Class...>
  <Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}">
    ...
  </Grid>
</UserControl>

答案 1 :(得分:2)

DataContext是继承的。如果您已更改控件的DataContext,使其不再引用viewmodel并指向其自身,则子控件将无法再访问viewmodel上的属性。

如果你的代码隐藏中有一个指向viewmodel的属性,你可以这样做:

<Controls:RoundProgress Visibility="{Binding ViewModel.ProgressVisibility}" ...

或者您可以保留datacontext(指向viewmodel)并将相对源添加到您希望数据来自代码隐藏的任何绑定 - 例如:

<Button Text="{Binding ButtonText, Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type MyUserControl}}}"/>