【问题标题】:How to set DataContext to self如何将 DataContext 设置为 self
【发布时间】:2013-12-06 09:09:46
【问题描述】:

我的 UserControl 需要绑定到祖先(祖先是 MainWindow)和自身(它是隐藏的代码)。

要绑定到祖先,我正在使用

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}"> 

要将控件绑定到后面的代码(因此使用“本地”DataContext),我正在使用

<TextBlock Text ="{Binding MyUC3Property}" Name="MyName" />

在后面的代码中,设置如下

this.MyName.DataContext = this;

以上工作正常,我可以绑定到代码隐藏和祖先。

现在,我仍然想绑定到后面的代码和祖先,但只在 XAML 中设置 DataContext(如果可能的话)。

我试过了

<TextBlock Text ="{Binding MyUC3Property}" DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" /> 

并确保构造函数不设置 DataContext(因为我希望这一切都在 XAML 中完成)-(尽管即使我设置了 this.DataContext = this; 错误仍然存​​在)

输出窗口告诉我存在绑定错误。

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“TextBlock”(名称=“”)上找不到“MyUC3Property”属性。绑定表达式:路径=MyUC3Property;数据项='文本块'(名称='');目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

我想我遗漏了一些明显的东西,但我不知道是什么。

【问题讨论】:

  • 什么绑定错误?错误信息是什么?
  • 在窗口/控件集的构造函数this.DataContext = this;
  • 我想您将问题中的示例源代码的MyUC3Property 重命名为MyLocalProperty
  • @RononDex 我确实尝试过这个,但它有什么帮助?它将“覆盖”我确实想要绑定到父级。
  • @DaveRook 希望此 pdf 对您有所帮助nbdtech.com/Free/WpfBinding.pdf

标签: c# wpf xaml


【解决方案1】:

您应该能够像绑定到窗口一样绑定到用户控件:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=UserControl}}">

您尝试的是从TextBox 引用相对源Self。但是,在这种情况下,Self 指的是TextBox,而不是封闭的用户控件。

【讨论】:

  • 这让我头疼。你是对的,这回答了问题,但如何?后面的代码肯定是self,但看起来好像我们正在寻找一个比这个控件高一级的祖先?
  • 很抱歉我只能给出 1 * +1,多么清晰的解释。谢谢
  • 在这种情况下使用 ElementName 绑定更容易 - 更容易让您的头脑更轻松;)
  • @blindmeis: True @head, 尽管 YMMV - 当通过复制和粘贴插入许多此类绑定时,将 ElementName 值更改为当前用户控件的名称(除非它完全非描述性名称,看起来有些草率)比绑定到下一个UserControl祖先更麻烦。
【解决方案2】:

对于用户控件,您永远不应该将 datacontext 设置为 self。检查 H.B. 的评论。来自here

我使用 ElementName 绑定

 <UserControl x:Name="uc">
   <TextBlock Text="{Binding ElementName=uc, Path=MyDependencyPropertyDefinedInMyUserControl}"/>

使用用户控件:

 <Window>
   <MyUserControl MyDependencyPropertyDefinedInMyUserControl="{Binding Path=MyValueForTheTextBox}"/>

我尝试为您的文本框案例解释一下(忽略我糟糕的英语顺便说一句:))

如果你想创建一个带有文本框的用户控件,并且这个用户控件/文本框应该在不同的视图中显示来自不同视图模型的文本 - 那么你有一个问题,因为视图模型有不同的属性名。现在你的用户控件中的依赖属性进入了游戏。您创建一个 DP,您的所有视图模型都可以绑定到其中,并将您的用户控件中的文本框绑定到您的用户控件中的 DP。

【讨论】:

  • 如果一切都像这样绑定,这是否意味着你最终会得到一个像 ViewModel 这样的大“神”(我没有问题,因为数据是相关的等等,我只是想得到一个更好的理解)
  • 用户控件的元素名绑定与视图模型无关。视图模型从用户控件绑定到 Dependency 属性
  • 我很欣赏这一点,但这仍然意味着所有属性都将生活在树的更高处。您的帖子确实有助于构建我的整个项目,非常感谢您。我猜,除了 DependancyProperties 之外,我所有的 UserControls 都应该是空的?那么函数/方法/命令呢,它们是否也应该存在于定义属性的地方?
【解决方案3】:

第一件事是您可能应该将您的父母DataContext 推到较低的级别。这将为您提供“上帝”ViewMode 在所有嵌套屏幕之间共享。

其次,您可能应该使用 MVVMLights Messanger 之类的东西来进行更清晰的分离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 2021-07-20
    • 2013-09-23
    • 2016-12-06
    • 2015-04-15
    • 2019-02-11
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多