【问题标题】:WPF/Silverlight: data binding a datacontext to a property programmaticallyWPF/Silverlight:以编程方式将数据上下文绑定到属性的数据
【发布时间】:2010-12-14 15:46:54
【问题描述】:

我有一些设置数据上下文的代码。通常情况下,应该将 datacontext 设置为一些底层数据集合,例如 ObservableCollection - 但有时我想将其设置为本身就是依赖属性的集合。

这可以在 xaml 中完成,但这样做违背了在两个场景之间共享 UI 代码的目的。

假设我有一个依赖属性:

public static readonly DependencyProperty MyDataProperty = [whatever];

在其他地方,我有一个控件希望我设置数据上下文:

myGreatControl.DataContext = ???

如何设置上述数据上下文以引用存储在依赖属性中的集合?

以下问题似乎相关: Silverlight: Programmatically binding control properties

但我不想将一个属性绑定到另一个属性,而是将一个属性绑定到数据上下文。这样做的好处是我不需要知道绑定代码的类型或名称甚至用途 - 任何FrameworkElement 都有一个数据上下文,并且我有一个我想绑定到它的(可更新的)属性。

【问题讨论】:

    标签: .net wpf silverlight data-binding


    【解决方案1】:

    通常,当你设置绑定时,如果你没有显式设置它所绑定的对象,只有成员的路径,它会使用 DataContext 对象。

    例如....

    <TextBlock Text="{Binding MyProperty}"/>
    

    将文本绑定到 DataContext 的属性“MyProperty”——而不是特定的集合。您可以在 ControlTemplates 中看到这一点,例如 ListBox 项。只要您的 DataContext 具有“MyProperty”属性就可以了。

    你也可以像这样直接绑定到DataContext...

    <TextBlock Text="{Binding}"/>
    

    我倾向于对父容器执行此操作...

    <Grid DataContext="{Binding}">
        <TextBlock Text="{Binding MyProperty}"/>
    </Grid>
    

    【讨论】:

    • 我不太确定你在做什么 - 如果我这样做了,我需要为每种情况修改 xaml。我正在尝试一般使用特定控件,并以编程方式将其“连接”到任何源代码 - 因此,控件不知道编译时我是否实际绑定到 MyProperty 或某些代码- 收集后。这就是为什么我希望能够直接绑定到集合或其他属性。
    【解决方案2】:

    花时间弄清楚如何提出问题的美妙之处在于,有时你会意识到这非常明显......

    我说过我不想将一个属性绑定到另一个属性,而是将一个属性绑定到数据上下文 - 好吧,事实证明,FrameworkElement.DataContext is 只是一个依赖属性;具体来说,FrameworkElement.DataContextProperty。

    简而言之,我可以这样做:

    Binding binding = new Binding("MyData") {
        Mode = BindingMode.OneWay,
        Source = this,
    };
    myGreatControl.SetBinding(FrameworkElement.DataContextProperty, binding);
    

    对不起,这个问题 - 希望这个问题可以为同样困惑的编码员节省一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2011-03-11
      • 2011-02-04
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多