我的 View 模型中有两个属性,分别称为PremisesTowns
我将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

最佳答案

您的假设是正确的。 ComboBoxTowns类中查找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

10-04 17:12