1

我正在使用绑定创建一个应用程序来普及TextBlock文本
这是我的网格

<Grid Name="ClientGird">
    <TextBlock Text="{Binding Name}"/>
</Grid>

在后面的代码中,我实例化了一个 Client 对象并将其设置为this.DataContext

MainWindow : Window
{
    public Client client { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = client;
    }
}

当我更改client Name属性值时,它将显示在窗口中

public MainWindow()
{
    InitializeComponent();
    this.DataContext = client;
    client.Name = "John";
}

所以,但是当我尝试更改对象时client,窗口没有显示新的上下文,为什么会发生这种情况?

public MainWindow()
{
    InitializeComponent();
    this.DataContext = client;
    client = myOtherClientObject;
}

我怎么解决这个问题?

4

3 回答 3

3

你需要这样做:

this.DataContext = myOtherClientObject;

您的代码client = myOtherClientObject;不会更改DataContext引用的内容,它仍然引用“旧”client值。

下面是关于引用类型在 C# 中如何工作的一点提醒(来自 msdn):

作为值类型的变量存储数据,而作为引用类型的变量存储对实际数据的引用。引用类型也称为对象。

您的client变量是引用类型,因此client仅引用数据(它不是数据)并且DataContext引用相同(感谢DataContext = client;)。当您更改client变量引用的数据时(使用client = myOtherClientObject;),它不会影响DataContext它所引用的数据。

于 2013-10-27T22:54:45.330 回答
1

做你的客户类实现

INotifyPropertyChanged

界面。这将在 ViewModel 或 ViceVersa 发生变化时通知您的视图。

于 2013-10-27T22:55:40.793 回答
1

尝试改变这个概念:

 this.DataContext = client;
 this.DataContext = null;
 this.DataContext = myOtherClientObject;
于 2013-10-27T23:06:00.817 回答