DataContext 和使用 RelativeSource 绑定自身的问题

21

有人能解释一下下面这行 XAML 代码吗?

DataContext="{Binding RelativeSource={RelativeSource Self}}"

这里提供了使用的简单示例。

如何用C#代码替换该行?


1
为什么要两次使用“RelativeSource”? - ed22
3个回答

14

这只是将 DataContext 属性设置为具有该属性的对象。代码等价于 this.DataContext = this;

编辑

DataContext 属性是在此对象及其子对象上发生的所有绑定所使用的上下文对象。如果你没有正确设置要绑定到的模型的 DataContext,则所有绑定都将失败。

编辑2

以下是如何在代码后台中设置它(与您的示例匹配):

public partial class ListViewTest : Window
{
    ObservableCollection<GameData> _GameCollection = 
        new ObservableCollection<GameData>();

    public ListViewTest()
    {
        _GameCollection.Add(new GameData { 
          GameName = "World Of Warcraft", 
          Creator = "Blizzard", 
          Publisher = "Blizzard" });
        _GameCollection.Add(new GameData { 
          GameName = "Halo", 
          Creator = "Bungie", 
          Publisher = "Microsoft" });
        _GameCollection.Add(new GameData { 
          GameName = "Gears Of War", 
          Creator = "Epic", 
          Publisher = "Microsoft" });

        InitializeComponent();

        this.DataContext = this;   //important part
    }

    public ObservableCollection<GameData> GameCollection
    { get { return _GameCollection; } }

    private void AddRow_Click(object sender, RoutedEventArgs e)
    {
      _GameCollection.Add(new GameData { 
          GameName = "A New Game", 
          Creator = "A New Creator", 
          Publisher = "A New Publisher" });
    }
}

好的,但为什么?如果我删除这行代码,为什么我就不能向我的ListView添加任何新对象? - gliderkite
如果你正在做你链接的例子,我的猜测是对象已经被正确添加到了你的“ObservableCollection”,但绑定失败了。 - Dylan Meador
是的,我想知道为什么在这个例子中他以那种方式设置了DataContext,以及是否有一种不使用XAML行的方法。 - gliderkite
1
@gliderkite他这样做是因为他的Window类包含了他绑定的属性:GameCollection。要在代码中实现这个,把你的Window类的DataContext属性设置为你的Window类的实例即可。 - Dylan Meador

2
这句话的含义是“DataContext是此DataContext属性和控件的所有者”。
在C#中,它应该被表述为:
myTextBox.DataContext = myTextBox;

这对我来说没有太多意义。自我引用不应该是默认值吗? - The incredible Jan
1
在WPF中,数据绑定通常假设您希望将绑定目标设置为业务模型,该模型存储在DataContext中。这样,您就可以直接将视图绑定到数据。但在某些情况下,您可能需要引用其他视图对象或自己的控件。在这些情况下,您需要将源重写为另一个目标,而不是默认的DataContext。 - dowhilefor
我提出问题的原因是我“继承”了一个没有太多文档的项目,有时在XAML编辑器中会收到有关缺少DataContext的警告,但在运行时没有问题。大多数情况下,窗口的构造函数调用“LayoutRoot.DataContext = this;”,并且绑定使用其CodeBehind中的属性。我正在慢慢理解它,我想。 :) - The incredible Jan

0
回答你的第二个问题: 有时在XAML中声明DataContext是有用的,因为你可以在设计时看到数据绑定。如果你通过代码声明它,数据绑定只会在运行时完成。
还有其他方法可以实现设计时(虚假)数据。要了解更多,请查询“bendability”。
注意:作为一般规则,请记住如果你有另一个问题,应该创建一个新的stackoverflow请求 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接