2013-10-27 41 views
0

我创建使用的普及TextBlock文本
结合应用这是我的网如何更改绑定对象?

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

在后面的代码我有实例的客户对象,并设置它this.DataContext

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

当我改变了clientName属性的值,它会显示在窗口中

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

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

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

我该如何解决这个问题?

+0

除了下面的答案,它doesns't看来,你实际上初始化'client',或者它未显示 –

+0

它不显示“myOtherClientObject”名称,但myOtherClientObject不为空 – Lai32290

回答

3

你需要做的是这样:

this.DataContext = myOtherClientObject; 

您的代码client = myOtherClientObject;不会改变什么DataContext被引用,它仍然引用“旧” client值。

下面是引用类型是如何工作在C#(从MSDN)的小reminder

的变量是值类型存储数据,以及那些 引用类型引用存储的实际数据。参考类型 也被称为对象。

client变量是引用类型,所以client仅参照数据(它不是数据)和DataContext是相同的(由于DataContext = client;)引用。当您更改变量所引用的client数据(使用client = myOtherClientObject;)时,它不会影响DataContext及其引用的数据。

+0

是工作,但是不可能解决这个变化的'客户'对象吗? – Lai32290

+0

绑定是从您的DataContext参考对象直接获取上下文吗? – Lai32290

+0

你是否想改变你的客户端变量(仅),因为你正在同一个类的其他地方使用它? – AirL

1

做你的客户端类实现

INotifyPropertyChanged

接口。这会在ViewModel或ViceVersa中发生变化时通知您的视图。

+0

谢谢!我喜欢这个解决方案,它会帮助我 – Lai32290

1

尝试改变这一概念:

this.DataContext = client; 
this.DataContext = null; 
this.DataContext = myOtherClientObject; 
相关问题