DataContext 和绑定 self 作为 RelativeSource

Posted

技术标签:

【中文标题】DataContext 和绑定 self 作为 RelativeSource【英文标题】:DataContext and binding self as RelativeSource 【发布时间】:2012-09-07 23:29:04 【问题描述】:

有人可以解释一下下面的 XAML 行吗?

DataContext="Binding RelativeSource=RelativeSource Self"

Here的简单使用示例。

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

【问题讨论】:

为什么会有两次“RelativeSource”? 【参考方案1】:

这只是将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,但绑定失败。 是的,我想知道为什么在示例中他以这种方式设置 DataContext,以及是否有办法不使用 XAML 行。 @gliderkite 他这样做是因为他的 Window 类包含他绑定到的属性:GameCollection。要在代码中执行此操作,请将 Window 类的 DataContext 属性设置为等于 Window 的实例【参考方案2】:

这意味着“DataContext 是此 DataContext 属性的所有者”,因此是控件。

在 C# 中是这样的

myTextBox.DataContext = myTextBox;

【讨论】:

【参考方案3】:

回答你的第二个问题: 有时在 XAML 上声明 DataContext 可能很有用,因为您可以在设计时看到数据绑定。如果通过代码声明,数据绑定只会在运行时完成。

还有其他方法可以获取设计时(假)数据。如需了解更多,请查询“可弯曲性”。

注意:作为一般规则,请记住,如果您有其他问题,您应该创建一个新的 *** 请求 :-)

【讨论】:

以上是关于DataContext 和绑定 self 作为 RelativeSource的主要内容,如果未能解决你的问题,请参考以下文章

绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异

ListBox 内的 DataContext ComboBox 绑定

DataContext 有啥用?

DataContext和ItemSource

通过 MVVM 模式创建 UserControl - DataContext 并绑定到父级

C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?