从ItemsControl中的项绑定到ItemControl的DataContext

时间:2011-10-10 11:07:13

标签: wpf binding itemscontrol

我有一个带有自定义ItemsTemplateSelector的ComboBox。控件的项目在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; target element is'MyItemWithValue'(HashCode = 49465727); target属性为'Value'(类型'Int32')”< / p>

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

编辑:

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

DataContext =“{Binding,Mode = TwoWay}”

3 个答案:

答案 0 :(得分: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

编辑 - 此外,您需要在组合框中设置两种方式的绑定模式,而不是在StaticResource中设置它。这应该有效 -

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我原以为最快的解决方案只是绑定到ComboBox s 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>