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

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

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

Here的简单使用示例。

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

【问题讨论】:

  • 为什么会有两次“RelativeSource”?

标签: c# xaml data-binding datacontext


【解决方案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 可能很有用,因为您可以在设计时看到数据绑定。如果通过代码声明,数据绑定只会在运行时完成。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2011-02-10
      • 2013-09-13
      • 1970-01-01
      • 2018-11-07
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多