如何使用XAML将数据绑定到祖先元素中的属性?

时间:2018-03-20 00:05:44

标签: c# wpf xaml mvvm data-binding

我正在使用C#和MVVM设计模式编写WPF应用程序。

我有以下(.)\1.*(.)\2.*(.)\3对象

c#

然后我有以下视图模型,这是我视图的public class ProductStyleGenericModel : BindableBase { public int Id { get; set; } public string Name { get; set; } public int? SelectedValue { get; set; } public IEnumerable<SelectListItem<int>> Items { get; set; } }

DataContext

最后,我有以下XAML视图,它只显示public class EditProductViewModel : BindableBase { public IEnumerable<ProductStyleGenericModel> Styles { get; set;} // ....... // I removed the rest for the code of simplicity } 。每个ListBox都有一个网格,其中ListBoxItem位于左侧,TextBlock位于右侧。

ComboBox

当选择<GroupBox Header="Product Description"> <StackPanel> <ListBox ItemsSource="{Binding Styles}"> <ListBox.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="2*" /> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Name}" /> <ComboBox ItemsSource="{Binding Items}" Grid.Column="1" SelectedValue="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=SelectedValue, Mode=TwoWay}" SelectedValuePath="Value" DisplayMemberPath="Text"/> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </GroupBox> 中的项目时,我想使用双向绑定更新DataContext.Styles.SelectedValue,以便我知道选择了哪个值,然后将其存储在数据库中。

问题

由于某些原因,ComboBox集合中的每个SelectedValue始终为Styles,并且在选择所选项目时不会更新。

我猜我试图将0绑定到ComboBox.SelectedValue的原因不正确。

我在这里写的逻辑是......找到类型为Styles.SelectedValue的直接祖先,然后使用ListBox绑定到源对象上的SelectedValue属性

请注意,我正在使用Fody.PropertyChanged packagePath=SelectedValue课程上实施INotifyPropertyChanged,{{3}}会在编译时将BindableBase注入属性设置器。

问题

我在这做什么,我该如何解决这个问题?

已更新

如果需要,这是我的RaisePropertyChanged课程

SelectedListItem

1 个答案:

答案 0 :(得分:1)

我认为绑定可能是错误的。试试这个:

<ComboBox ItemsSource="{Binding Items}"
          Grid.Column="1"
          SelectedValue="{Binding SelectedValue}"
          SelectedValuePath="Value"
          DisplayMemberPath="Text"/>

我认为你要绑定的属性SelectedValue在当前数据上下文中。你绑定的属性是ListBox控件上的SelectedValue,至少对我没有任何意义。