【问题标题】:WPF binding, when the reference of object changesWPF绑定,当对象的引用发生变化时
【发布时间】:2012-10-18 05:58:12
【问题描述】:

代码sn-p:

xaml

<TextBlock Grid.Row="0"  Text="{Binding Path=NodeType}"></TextBlock>
<Button Name="bt" Grid.Row="1" Click="bt_Click">click</Button>

c#

public FamilyMemberInfo MemberInfo;
public MainWindow()
{
    InitializeComponent();

    MemberInfo = new FamilyMemberInfo();
    MemberInfo.NodeType = "aa";
    this.DataContext = MemberInfo;
}
private void bt_Click(object sender, RoutedEventArgs e)
{
    //MemberInfo.NodeType = "bb";
    FamilyMemberInfo mi2 = new FamilyMemberInfo();
    mi2.NodeType = "bb";
    MemberInfo = mi2; 
}

如果我将 NodeType 更改为“bb”,则文本块也会更改,但如果我创建一个平淡无奇的新对象并将属性 NodeType 设置为“bb”,然后将其分配给 MemberInfo,则不会更新文本块。谁能为我解释一下?提前致谢。

假设“FamilyMemberInfo”类有 20 个属性,所有属性都与 UI 上的元素(文本块、组合框等)绑定,我从其他地方获得了 FamilyMemberInfo 的实例,我想简单地将其分配给上面的代码中的 MemberInfo 以使 UI 相应地更新,如何使其工作?

谢谢。

【问题讨论】:

    标签: wpf binding reference


    【解决方案1】:

    您必须将DataContext 设置为您创建的新实例。

    private void bt_Click(object sender, RoutedEventArgs e) 
    { 
        //MemberInfo.NodeType = "bb"; 
        FamilyMemberInfo mi2 = new FamilyMemberInfo(); 
        mi2.NodeType = "bb"; 
        MemberInfo = mi2; 
        this.DataContext = MemberInfo; // you have to add this line to the code
    } 
    

    原因是当你在构造函数中设置this.DataContext = MemberInfo;时,它指向你在构造函数中创建的对象,我们将其命名为对象A

    现在你设置MemberInfo = mi2mi2 是一个差异对象,你设置MemberInfo 指向mi,而你创建的对象A 仍然存在并且this.DataContext 是仍然指向那个对象。

    所以,你必须设置DataContext 指向新对象,如上面的代码。

    【讨论】:

    • 啊哈,酷,它有效!我怎么可能没有注意到,:(。谢谢一百万。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多