我的viewmodel中有两个属性,名为Premises
和Towns
。
我将ListViewItems绑定到Premises
,并且在itemtemplate中我想绑定到Towns
,但是当我使用以下XAML时,它尝试绑定到Premises.Towns
而不是Towns
{1}}。
如何直接绑定到Towns
?
视图模型:
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
。
答案 0 :(得分:2)
你的假设是正确的。 ComboBox
在Towns
类中查找Premise
,这是每个ListViewItem
背后的类如果要引用与ListView
相同的上下文,则需要使用RelativeSource
{1}}绑定。
<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
个内容,因此您最终会{ {1}}在另一个ComboBoxItem
答案 1 :(得分:1)
将ItemsSource绑定到Premises属性,因此如果绑定到OverviewListViewItemStyle中的Towns,绑定引擎将在Premise对象中查找名为Towns的属性。
如果您想为某个场所选择一个城镇,您应该告诉组合框从该房产的哪个角落。您可以尝试将组合框的datacontext设置为主视图模型,并在绑定中使用相对源。像这样的东西:
ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.Towns}"