【问题标题】:Binding from items in ItemsControl to ItemControl's DataContext从 ItemsControl 中的项目绑定到 ItemControl 的 DataContext
【发布时间】:2011-12-04 10:38:03
【问题描述】:

我有一个带有自定义 ItemsTemplateSelector 的 ComboBox。控件的 Items 在 xaml 中定义,如下所示:

<ComboBox ItemTemplateSelector="{StaticResource CommonListSelectorTemplates}" >
    <local:MyItem Heading="First" Text="First Item"/>
    <local:MyItem Heading="Second" Text="Second Item"/>
    <local:MyItemWithValue Heading="Third" Text="Third Item" Value="{Binding TheValue}" />
</ComboBox>

第三个项目有一个 Value 属性,我希望将其绑定到 ComboBox 的 DataContext 上的 TheValue 属性。此绑定失败并出现以下错误:

“找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=TheValue;DataItem=null;目标元素是 'MyItemWithValue' (HashCode=49465727);目标属性是 'Value' (类型 'Int32')"

我猜这是因为 Items 集合不使用 ComboBox 的 DataContext。我尝试了 RelativeSource 的不同排列但没有成功,所以我的问题是:完成绑定的最佳方法是什么?

编辑:

RV1987 如前所述回答了我的问题。但是,我想要的是双向绑定,并且所提出的解决方案似乎都不适用于此。问题可能是我无法让代理中的绑定成为双向的;编译器拒绝接受

DataContext="{Binding, Mode=TwoWay}"

【问题讨论】:

    标签: wpf binding itemscontrol


    【解决方案1】:

    ComboboxItems 不是可视化树的一部分,因此它们没有连接到Combobox 的数据上下文。您必须使用代理绑定来引用 dataContext。有关详细和干净的方法,请查看此链接 -

    http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

    此外,按照 AngelWPF 的建议,看看这个(同样的问题,但在这种情况下它的数据网格代替了组合框),这对我来说也是新事物 -

    Bind datagrid column visibility MVVM

    编辑-此外,您需要在组合框项中设置绑定模式两种方式,而不是在静态资源中设置。这应该工作 -

    <local:MyItemWithValue Heading="Third" Text="Third Item" Value="{Binding TheValue, Mode=TwoWay}" />
    

    【讨论】:

    • 我尝试了第二个链接中的方法,效果很好!非常感谢。
    • ...除了我忘了提到我实际上想要一个双向绑定,而且这两个链接似乎都无法使用。有什么想法吗?
    • 您是否尝试过使用第一种方法设置两种方式的绑定?我想这不应该是那里的问题。
    • 非常感谢您的帮助!我发现了问题,这是 DataTemplate 中的错误,完全不相关。正如您所描述的,绑定现在可以双向工作,在 Value 绑定上设置模式。
    • 第一个链接失效
    【解决方案2】:

    我原以为最快的解决方案就是绑定到ComboBoxs DataContext 属性。您应该能够通过使用命名元素来解决 RelativeSource 的问题:

    <ComboBox x:Name="combo" ItemTemplateSelector="{StaticResource CommonListSelectorTemplates}" >
        <local:MyItem Heading="First" Text="First Item"/>
        <local:MyItem Heading="Second" Text="Second Item"/>
        <local:MyItemWithValue Heading="Third" Text="Third Item"
            Value="{Binding DataContext.TheValue, ElementName=combo}" />
    </ComboBox>
    

    【讨论】:

    • 这也不起作用。我相信这是因为元素名称查找失败,因为项目集合在可视化树之外。
    【解决方案3】:

    local:MyItemWithValue 不是 FrameworkElement,因此不能继承 ComboBox DataContext
    this note:
    “WPF 不会为当前版本的自定义类添加继承上下文,因此第二个绑定无法解析“数据上下文”引用,如果您想启用这种绑定,只需简单地从 FrameworkElement 或 FrameworkContentElement 子类化即可。”

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2010-12-03
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2020-04-04
      • 2011-01-09
      相关资源
      最近更新 更多