我有一个UserControl barView
和相应的ViewModel barViewModel
。此ViewModel具有属性SelectedSomething
,在我的视图中绑定到不同的ListBox。
如果我有这样的结构,那么一切都很好:
<UserControl DataContext="barViewModel">
<ListBox ItemsSource="{Binding ObservableCollectionWithItems}"
SelectedItem="{Binding SelectedSomething, Mode=TwoWay}">
....
</ListBox>
</UserControl>
在这种情况下,我的ViewModel具有包含项目的ObservableCollection。
现在我想将我的项目拆分为组。我为此创建了一个separete类:
class ItemsGroup
{
private string _Name;
public string Name {...}
private List<Item> _ItemsList;
public List<Item> ItemsList {...}
}
我的barViewModel
现在包含ItemsGroup
个<UserControl DataContext="barViewModel">
<ItemsControl ItemsSource="{Binding ObservalbeCollectionWithItemsGroup}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type test:ItemsGroup}">
<Expander IsExpanded="False">
<Expander.Header>
<TextBlock Content="{Binding Name}"/>
</Expander.Header>
<ListBox ItemsSource="{Binding ItemsList}" Margin="10"
SelectedItem="{Binding SelectedSomething, Mode=TwoWay}">
...
</ListBox>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
个对象的观察集合。对此的新观点如下:
Text="{Binding SelectedSomething,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type UserControl}}}"
问题是ListBox的SelectedItem绑定到父级并显示此错误:
System.Windows.Data错误:40:BindingExpression路径错误:&#39; SelectedSomething&#39;在&#39; object&#39;上找不到的属性&#39;&#39; ItemsGroup&#39; (的HashCode = 10335672)&#39 ;. BindingExpression:路径= SelectedSomething;的DataItem =&#39; ItemsGroup&#39; (的HashCode = 10335672);目标元素是&#39; ListBox&#39; (名称=&#39;&#39); target属性是&#39; SelectedItem&#39; (键入&#39;对象&#39;)
我尝试将SelectedItem更改为:
SelectedSomething
这将删除错误,但我的 function editPickUpAddress(divId)
{
("#pickupAddressForm_"+divId).show();
}
仍未绑定到ListBox。我该如何解决这个问题?
答案 0 :(得分:2)
当DataContext
是主视图模型中的属性,并且UserControl的SelectedItem="{Binding DataContext.SelectedSomething,
RelativeSource={RelativeSource AncestorType=UserControl}}"
设置为该视图模型的实例时,绑定应如下所示:
Mode=TwoWay
另请注意,没有必要在SelectedItem
绑定上设置node.run_state
,因为该属性默认绑定为双向。