我想对我的应用程序进行快速用户控制,但为了保持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删除我的小叮当 - 可见性有效!
有人能帮我问好吗?感谢
答案 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}}}"/>