我的 View 模型中有两个属性,分别称为Premises
和Towns
。
我将ListViewItems绑定(bind)到Premises
,在itemtemplate中我想绑定(bind)到Towns
,但是当我使用以下XAML时,它将尝试绑定(bind)到Premises.Towns
而不是Towns
。
如何直接绑定(bind)到Towns
?
View 模型:
public class MainWindowViewModel
{
public ObservableCollection<Premise> Premises;
public List<Town> Towns;
}
XAML:
<ListView x:Name="PremisesList" Margin="195,35,10,10"
ItemContainerStyle="{StaticResource OverviewListViewItemStyle}"
ItemsSource="{Binding Premises}" HorizontalContentAlignment="Stretch">
这就是我的
OverviewListViewItemStyle
中的内容。 <ComboBox ItemsSource="{Binding Towns}" Grid.Row="2" Grid.ColumnSpan="3">
<ComboBox.ItemTemplate>
<DataTemplate>
<ComboBoxItem>
<TextBox Text="{Binding Name}" />
</ComboBoxItem>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我希望能够通过XAML为
Town
选择Premise
。 最佳答案
您的假设是正确的。 ComboBox
在Towns
类中查找Premise
,该类是每个ListViewItem
后面的类。如果要引用与ListView
相同的上下文,则需要使用RelativeSource
绑定(bind)。
<ComboBox
ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.Towns}"
Grid.Row="2"
Grid.ColumnSpan="3"
DisplayMemberPath="Name"/>
与您的问题无关,但您也无需指定
DataTemplate
即可显示单个属性。 DisplayMemberPath
也可以使用。如果您确实指定了DataTemplate
,则无需使用ComboBoxItem
,因为ComboBox
会将DataTemplate
内容包装在ComboBoxItem
中,因此有效的是,您最终会在另一个ComboBoxItem
中包含ComboBoxItem