1

我对 C# 和 WPF 完全陌生,我正在努力使用数据绑定。我有一个实现 INotifyPropertyChanged 的​​ MyClass;所以每次我更改属性值时,都会在我的 UI 中更新。然后我将堆栈面板的 DataContext 绑定到 MyClass 的对象。像这样:

<StackPanel Name="stackPanel1" DataContext="{Binding}">
        <TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
</StackPanel>

在后面的代码中我这样做:

item = new MyClass();
stackPanel1.DataContext = item;

并且绑定工作正常。如果我用另一个替换我当前的绑定源对象,我必须通过再次键入 datacontext 绑定来手动设置它:

item = new MyClass();
stackPanel1.DataContext = item;
item1 = new MyClass();
.
. //manipulate item1
.
if (item1 is ok)
   item=item1;
   stackPanel1.DataContext = item;

有没有更好的方法来替换我的源对象并更新所有关联的绑定?

4

3 回答 3

1

当您说 时stackPanel1.DataContext = item;,您是在设置属性,而不是绑定它。

设置属性时,您将其设置为等于对象的实例。当你绑定它时,你告诉它它将从其他位置获取它的值,所以在它需要获取值的任何时候查看那个位置。

提供包含绑定属性的类实现INotifyPropertyChanged,然后 UI 将在绑定属性更改时收到警报,这会导致重新评估绑定。

例如,如果您已将DataContext初始设置为

MyWindow.DataContext = this;

你的窗口在哪里this,你的窗口有一个MyClass名为的属性Item,那么你可以DataContext使用以下方法绑定

<StackPanel DataContext="{Binding Item}" ...>

并且每当您更新属性Item时,您的 StackPanelDataContext也会更新(前提是您实施INotifyPropertyChanged)。

如果您有兴趣,我喜欢在博客中介绍 WPF 中的初学者概念,您可能有兴趣查看我的文章您所说的“DataContext”是什么?DataContext,这是对它是什么以及如何使用它的一个非常简单的解释。

总而言之,WPF 有两层:UI 层和数据层。DataContext是数据层,当你写的时候,{Binding SomeProperty}你实际上是在绑定数据层。通常,您DataContext在后面的代码中设置一次数据层 ( ),然后在 XAML 中使用绑定来使您的 UI 层显示来自数据层的信息。

(您可能也有兴趣查看我的Simple MVVM Example,其中包含一个非常简单的工作代码示例,并说明了一些如何INotifyPropertyChanged实现以及 UI 层和数据层如何完全分离的示例)

于 2013-02-12T16:43:16.330 回答
0

CurrentItem您可以在 MainWindow(或 UserControl 或其他任何内容)中添加一个属性,并INotifyPropertyChange为该属性实现。然后设置

DataContext = this;

在 MainWindow 的构造函数中并像这样绑定:

Text="{Binding Path=CurrentItem.Title}" 

现在每当你设置

var item = new MyClass();
...
CurrentItem = item;

绑定将被更新。

于 2013-02-12T16:19:53.573 回答
0
DataContext="{Binding}"

stackPanel1.DataContext = item;

两者基本上做同样的事情。不同之处在于一个是在 XAML 中完成的,另一个是在代码中完成的。虽然第一个示例允许在给定绑定父级的情况下更新绑定,但每次您想要更改堆栈面板所附加的内容时,都必须更新第二个示例。恕我直言,您应该创建一个通用的绑定父级来绑定。这将允许您更改子绑定,而不必每次都设置上下文。

<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 ;

现在,如果在 ParentClass 上正确创建了 notify 属性更改,您可以更改子堆栈面板的绑定

parent.Child= new NewClass();
于 2013-02-12T16:20:39.197 回答