主题:如何防止UserControl上的绑定使用此UserControl覆盖上(主)窗口给出的绑定。
我已经阅读了有关该主题的帖子和一些书籍,但我仍然对绑定机制感到困惑。 即使在一些专业书籍中,也几乎没有提到 DependencyProperty 或 AttachedProperty 的术语。 微软的文档很好,但有点裸露。
感谢你让我再次走向正确的方向
这个例子极大地简化了Head First C#的BasketballRoster MVVM示例
我有 usercontrol ,一个简单的圈
...
xmlns:vm_nmspc="clr-namespace:BindingMCVE.ViewModel" >
<UserControl.Resources>
<vm_nmspc:my_usercontrol_vm x:Key="MyUserControlVM"/>
</UserControl.Resources>
<Grid>
<StackPanel DataContext="{DynamicResource ResourceKey=MyUserControlVM}" Height="100" Width="100">
<Ellipse Fill="{Binding my_color}" Height="50" Width="50"/>
</StackPanel>
</Grid>
我喜欢的是提供一个无参数构造函数 my_usercontrol_vm(),以便我可以查看我的圈子用红色填充处理我的UserControl视图。
为此,我在 UserControlResources 中使用 class my_usercontrol_vm的实例。 在这里,我使用 DynamicResource 关键字(我首先测试了StaticResource)
class my_usercontrol_vm
{
public string my_color {get; set;}
public my_usercontrol_vm() : this("Red") { }
public my_usercontrol_vm(string color)
{
my_color = color;
}
}
现在我想在(主)窗口中使用几个UserControl,仍然使用绑定来查看&#34;实时&#34; 我的演变图。
xmlns:vm_nmspc="clr-namespace:BindingMCVE.ViewModel" >
<Window.Resources>
<vm_nmspc:main_window_vm x:Key="MainWindowVM"/>
</Window.Resources>
<Grid>
<StackPanel DataContext="{DynamicResource ResourceKey=MainWindowVM}">
<view_nmspc:UserControl1 DataContext="{Binding usr_ctrl_1}"/>
<view_nmspc:UserControl1 DataContext="{Binding usr_ctrl_2}"/>
</StackPanel>
</Grid>
</Window>
专用于MainWindow的 ViewModel 类
class main_window_vm
{
public my_usercontrol_vm usr_ctrl_1 { get; set; }
public my_usercontrol_vm usr_ctrl_2 { get; set; }
public main_window_vm()
{
usr_ctrl_1 = new my_usercontrol_vm("Green");
usr_ctrl_2 = new my_usercontrol_vm("Blue");
}
}
请注意,我期待看到绿色和 BLUE 已填充的圈子。
然而,我得到的是红色圈
我会得到绿色和蓝色的圆圈我没有在UserControl中放置资源
使用调试器时,我可以看到我首先输入类 main_window_vm 的构造函数,然后(2次)输入类 my_user_control_vm 之一,以便两个圆圈终于是红色的。
我知道目前我可能有10%意识到WPF,但我认为这样做是非常正确的。最后我要求在MainWindow内部 UserControl1 控件绑定到类 main_window_vm 的属性usr_ctrl_X
欢迎任何建议。
最诚挚的问候。
NGI
答案 0 :(得分:1)
您正在设置DataContext
的{{1}},但UserControl
未使用此内容,因为这会继承Ellipse
的{{1}}。这不会更改,并且始终绑定到您的DataContext
资源。
您应该从StackPanel
中删除MyUserControlVM
。如果将其添加到DataContext="{DynamicResource ResourceKey=MyUserControlVM}"
,则绑定应覆盖它。您还可以使用混合设计命名空间来设置仅在设计时使用的设计StackPanel
。
答案 1 :(得分:0)
根据Charles Mager的回答(非常感谢),我在自己的问题上发表回复,以便每个人都有答案说明。
所以charles建议将 DataContext 放入 UserControl 而不是 StackPanel
<UserControl x:Class="BindingMCVE.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="100"
xmlns:vm_nmspc="clr-namespace:BindingMCVE.ViewModel"
DataContext="{DynamicResource ResourceKey=MyUserControlVM}" >
<!--DataContext added above-->
<UserControl.Resources>
<vm_nmspc:my_usercontrol_vm x:Key="MyUserControlVM"/>
</UserControl.Resources>
<Grid>
<!--DataContext removed from StackPanel below-->
<StackPanel Height="100" Width="100">
<Ellipse Fill="{Binding my_color}" Height="50" Width="50"/>
</StackPanel>
</Grid>
</UserControl>
这就是: