C# 用另一个对象替换当前绑定源对象
我对C#和WPF完全是新手,我正努力在数据绑定方面做到最好。我有一个MyClass,它实现了INotifyPropertyChanged;所以每次我更改属性值时,它都会在我的UI中更新。然后我将stackpanel的DataContext绑定到MyClass的对象。像这样:C# 用另一个对象替换当前绑定源对象,c#,wpf,data-binding,C#,Wpf,Data Binding,我对C#和WPF完全是新手,我正努力在数据绑定方面做到最好。我有一个MyClass,它实现了INotifyPropertyChanged;所以每次我更改属性值时,它都会在我的UI中更新。然后我将stackpanel的DataContext绑定到MyClass的对象。像这样: <StackPanel Name="stackPanel1" DataContext="{Binding}"> <TextBlock Name="textBlock1" Text="{Bin
<StackPanel Name="stackPanel1" DataContext="{Binding}">
<TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
</StackPanel>
装订很好。如果用另一个对象替换当前绑定源对象,则必须通过再次键入datacontext绑定来手动设置:
item = new MyClass();
stackPanel1.DataContext = item;
item1 = new MyClass();
.
. //manipulate item1
.
if (item1 is ok)
item=item1;
stackPanel1.DataContext = item;
是否有更好的方法来替换我的源对象并更新所有关联的绑定?您可以在主窗口(或用户控件或其他任何属性)中添加一个
CurrentItem
属性,并为该属性实现INotifyPropertyChange
。然后设置
DataContext = this;
在主窗口的构造函数中,按如下方式绑定:
Text="{Binding Path=CurrentItem.Title}"
现在无论你什么时候出发
var item = new MyClass();
...
CurrentItem = item;
绑定将被更新。您可以在主窗口(或用户控件或其他任何属性)中添加
CurrentItem
属性,并为该属性实现INotifyPropertyChange
。然后设置
DataContext = this;
DataContext="{Binding}"
在主窗口的构造函数中,按如下方式绑定:
Text="{Binding Path=CurrentItem.Title}"
现在无论你什么时候出发
var item = new MyClass();
...
CurrentItem = item;
绑定将被更新
DataContext="{Binding}"
及
两者的作用基本相同。区别在于一个是在XAML中完成的,另一个是在代码中完成的。虽然第一个示例允许在给定绑定父级的情况下更新绑定,但第二个示例必须在每次更改stackpanel所附加的内容时更新。IMHO您应该创建一个要绑定的公共绑定父级。这将允许您更改子绑定,而不必每次都设置上下文
<StackPanel Name="parentPanel">
<StackPanel Name="stackPanel1" DataContext="{Binding Path=Child}">
<TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
</StackPanel>
</StackPanel>
parent = new ParentClass();
parent.Child= new MyClass();
parentPanel.DataContext = parent ;
及
两者的作用基本相同。区别在于一个是在XAML中完成的,另一个是在代码中完成的。虽然第一个示例允许在给定绑定父级的情况下更新绑定,但第二个示例必须在每次更改stackpanel所附加的内容时更新。IMHO您应该创建一个要绑定的公共绑定父级。这将允许您更改子绑定,而不必每次都设置上下文
<StackPanel Name="parentPanel">
<StackPanel Name="stackPanel1" DataContext="{Binding Path=Child}">
<TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
</StackPanel>
</StackPanel>
parent = new ParentClass();
parent.Child= new MyClass();
parentPanel.DataContext = parent ;
当你说
stackPanel1.DataContext=item代码>,您正在设置属性,而不是绑定属性
设置属性时,将其设置为对象的实例。当您绑定它时,您告诉它将从其他位置获取其值,因此在需要获取值时随时查看该位置
如果提供包含绑定属性实现的类,则只要绑定属性发生更改,就会向UI发出警报,这会导致重新评估绑定
例如,如果最初使用设置了DataContext
MyWindow.DataContext = this;
如果此
是您的窗口,并且您的窗口具有类型为MyClass
的属性,称为Item
,那么您可以使用以下命令绑定DataContext
<StackPanel DataContext="{Binding Item}" ...>
每当您更新属性项
,StackPanel的数据上下文
也会更新(只要您实现)
如果您感兴趣,我会在博客上介绍WPF中的初学者概念,您可能会对我的文章感兴趣,这篇文章非常简单地解释了什么是DataContext
,以及如何使用它
总而言之,WPF有两层:UI层和数据层。DataContext
是数据层,当您编写{Binding SomeProperty}
时,实际上是绑定到数据层。通常,在代码隐藏中设置一次数据层(DataContext
),然后在XAML中使用绑定使UI层显示来自数据层的信息
(您可能还对查看my感兴趣,它包含一个非常简单的工作代码示例,并举例说明了如何实现INotifyPropertyChanged
,以及UI层和数据层如何完全分离)当您说stackPanel1.DataContext=item代码>,您正在设置属性,而不是绑定属性
设置属性时,将其设置为对象的实例。当您绑定它时,您告诉它将从其他位置获取其值,因此在需要获取值时随时查看该位置
如果提供包含绑定属性实现的类,则只要绑定属性发生更改,就会向UI发出警报,这会导致重新评估绑定
例如,如果最初使用设置了DataContext
MyWindow.DataContext = this;
如果此
是您的窗口,并且您的窗口具有类型为MyClass
的属性,称为Item
,那么您可以使用以下命令绑定DataContext
<StackPanel DataContext="{Binding Item}" ...>
每当您更新属性项
,StackPanel的数据上下文
也会更新(只要您实现)
如果您感兴趣,我会在博客上介绍WPF中的初学者概念,您可能会对我的文章感兴趣,这篇文章非常简单地解释了什么是DataContext
,以及如何使用它
总而言之,WPF有两层:UI层和数据层。DataContext
是数据层,当您编写{Binding SomeProperty}
时,实际上是绑定到数据层。通常,在代码隐藏中设置一次数据层(DataContext
),然后在XAML中使用绑定使UI层显示来自数据层的信息
(您可能还对查看my感兴趣,它包含一个非常简单的工作代码示例,并举例说明了如何实现INotifyPropertyChanged
,以及如何完全分离UI层和数据层。)