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 绑定
通过 MVVM 模式创建 UserControl - DataContext 并绑定到父级
C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?