Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用另一个对象替换当前绑定源对象_C#_Wpf_Data Binding - Fatal编程技术网

C# 用另一个对象替换当前绑定源对象

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

我对C#和WPF完全是新手,我正努力在数据绑定方面做到最好。我有一个MyClass,它实现了INotifyPropertyChanged;所以每次我更改属性值时,它都会在我的UI中更新。然后我将stackpanel的DataContext绑定到MyClass的对象。像这样:

<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层和数据层。)