我有一个带有自定义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}”
答案 0 :(得分:1)
ComboboxItems
不是可视树的一部分,因此它们不会连接到Combobox
的数据上下文。您必须使用代理绑定来引用dataContext。有关详细和清洁的方法,请查看此链接 -
另外,看看这个(同样的问题,但在这种情况下,它的数据网格代替组合框),如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>