WPF级联绑定

时间:2015-05-31 18:16:03

标签: c# wpf binding

主题:如何防止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视图。

UserControl alone

为此,我在 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 已填充的圈子。

然而,我得到的是红色

enter image description here

我会得到绿色和蓝色的圆圈我没有在UserControl中放置资源

使用调试器时,我可以看到我首先输入类 main_window_vm 的构造函数,然后(2次)输入类 my_user_control_vm 之一,以便两个圆圈终于是红色的。

我知道目前我可能有10%意识到WPF,但我认为这样做是非常正确的。最后我要求在MainWindow内部 UserControl1 控件绑定到类 main_window_vm 的属性usr_ctrl_X

欢迎任何建议。

最诚挚的问候。

NGI

2 个答案:

答案 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>

这就是:

enter image description here enter image description here