如何让ListBox列表项绑定原始ViewModel数据上下文而非项自身上下文
解决ListBox列表项绑定父ViewModel属性的问题
当ListBox的ItemTemplate中每个列表项的DataContext是单个Product对象时,要绑定到父ViewModel(即ListBox的DataContext)中的属性,有两种常用方案:
方案一:使用RelativeSource定位父级ListBox
通过RelativeSource向上查找ListBox控件,直接引用它的DataContext(也就是你的ViewModel),修改按钮的绑定代码如下:
<Button Grid.Row="0" Content="Delete" Background="Red" Visibility="{Binding Path=DataContext.DeleteButtonVisibility, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" /> <Button Grid.Row="1" Content="Bid" Background="LightGreen" Visibility="{Binding Path=DataContext.BidButtonVisibility, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" />
方案二:使用ElementName绑定
先给ListBox设置一个名称:
<ListBox x:Name="ProductListBox" ItemsSource="{Binding Products}" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
然后按钮绑定到该名称对应的控件的DataContext:
<Button Grid.Row="0" Content="Delete" Background="Red" Visibility="{Binding Path=DataContext.DeleteButtonVisibility, ElementName=ProductListBox}" /> <Button Grid.Row="1" Content="Bid" Background="LightGreen" Visibility="{Binding Path=DataContext.BidButtonVisibility, ElementName=ProductListBox}" />
关键注意点
确保ViewModel中的DeleteButtonVisibility和BidButtonVisibility属性实现了INotifyPropertyChanged接口,这样属性值变更时才能自动同步到UI界面。
内容的提问来源于stack exchange,提问作者Monset
相关产品推荐
相关产品推荐

