DataGridComboBoxColumn 为空

DataGridComboBoxColumn is empty

我的 DataGridComboBoxColumn 没有显示任何数据。它是空的。 我可以毫无问题地填充 ComboBox,但 DataGridComboBoxColumn 不起作用。
.NetFramework 4.6.1

型号:

public class Address
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Country { get; set; }
}

视图模型:

public class AddressViewModel
{
    public AddressViewModel()
    {
        LoadAdresses();
        LoadCountries();
    }

    public List<Address> AddressList { get; set; }
    public List<string> CountryList { get; set; }


    private void LoadAdresses()
    {
        AddressList = new List<Model.Address>();
        AddressList.Add(new Model.Address(){ Firstname = "Peter", Lastname = "R.", Country = "A" });
        AddressList.Add(new Model.Address(){ Firstname = "Tom", Lastname = "A.", Country = "A" });
        AddressList.Add(new Model.Address(){ Firstname = "Sam", Lastname = "F.", Country = "A" });
    }

    private void LoadCountries()
    {
        CountryList = new List<string>();
        CountryList.Add("A");
        CountryList.Add("D");
        CountryList.Add("CH");
        CountryList.Add("GB");
        CountryList.Add("F");
    }
}

查看:

<Window.DataContext>
    <vm:AddressViewModel/>
</Window.DataContext>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <DataGrid x:Name="AddressDataGrid" Grid.Row="0" ItemsSource="{Binding AddressList}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Firstname" Binding="{Binding Firstname}" />               
            <DataGridTextColumn Header="Lastname" Binding="{Binding Lastname}" />
            <DataGridComboBoxColumn Header="Country" 
                        SelectedItemBinding="{Binding Country}"
                        ItemsSource="{Binding CountryList}"/>
        </DataGrid.Columns>
    </DataGrid>

    <!--This ComboBox works-->
    <ComboBox Grid.Row="1" ItemsSource="{Binding CountryList}"/>
</Grid>

这种行为的原因是什么?

您正在 DataGridComboBoxColumn 中绑定到 属性 CountryList。但是这个属性不在你的classAddress中;它在您的 class AddressViewModel 中。这就是为什么您在 ComboBox 中看不到任何内容的原因;绑定无效。

您的 List<Address> AddressList 中的每个条目代表您的 DataGrid 中的一行,您可以使用 [=39= 在每一行中访问 Address 的每个 属性 ]绑定{Binding Property}。但是您想访问 属性,它位于包含 List<Address> AddressList 的 class 中。这就是为什么你必须使用不同的方式来绑定。有两种可能:

  • RelativeSource绑定
  • 通过ElementName
  • 绑定

这应该适合你

<DataGridComboBoxColumn Header="Country"
                        SelectedItemBinding="{Binding Country}">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource"
                    Value="{Binding Path=DataContext.CountryList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource"
                    Value="{Binding Path=DataContext.CountryList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

还有一个提示:如果您将集合绑定到您的视图,请使用 ObservableCollection 而不是 List 来保持您的视图是最新的。