绑定到第二个属性

时间:2014-12-13 09:24:43

标签: c# wpf xaml mvvm

我的viewmodel中有两个属性,名为PremisesTowns。 我将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

2 个答案:

答案 0 :(得分:2)

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