绑定SelectedItem以更正WPF中的DataContext

时间:2016-09-13 07:40:33

标签: c# wpf xaml mvvm

我有一个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。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

DataContext是主视图模型中的属性,并且UserControl的SelectedItem="{Binding DataContext.SelectedSomething, RelativeSource={RelativeSource AncestorType=UserControl}}" 设置为该视图模型的实例时,绑定应如下所示:

Mode=TwoWay

另请注意,没有必要在SelectedItem绑定上设置node.run_state,因为该属性默认绑定为双向。