【问题标题】:How to populate a DataGridComboBoxColumn?如何填充 DataGridComboBoxColumn?
【发布时间】:2015-10-21 10:14:25
【问题描述】:

我有一个 DataGrid,其中一列是 DataGridComboBoxColumn:

 <DataGrid AutoGenerateColumns="False" CanUserAddRows="True">
     <DataGrid.Columns>
           <DataGridTextColumn Header="User Name" Width="Auto" Binding="{Binding UName}"/>
           <DataGridComboBoxColumn Header="Country" Width="Auto" ????/>
     </DataGrid.Columns>
 </DataGrid>

我有一个 Country 课程:

public class Country{
  public string name {get; set;}
  public string des {get; set;}
  public Country() {}
  public Country(string n, string d) {
      this.name = n;
      this.des = d;
  }
}    

它们有名称和描述,我希望(多个 Country 对象的)名称填充组合框(以及每个组合框选项的工具提示),我该怎么做?

注意:稍后我想让用户能够添加新的国家/地区,所以我希望组合框也可以更改(包括新的国家/地区),这意味着解决方案需要允许这样做。

注意 2:我没有使用 MVVM 模式。编辑:意味着它不是重复的。

【问题讨论】:

  • 这如何解决我的问题?我没有使用 MVVM 模式,所以这个: ConnectionViewModel vm = new ConnectionViewModel();数据上下文 = vm;对我没有帮助。
  • 为您的列添加一个名称。在后面的代码中,创建一个国家列表并分配给它的 ItemsSource。
  • 这显示为对象,我只想要名称:我有一个名为“User”的类,它是数据网格中其余列的 itemSource(在上面的示例中 -用户名),每个用户都有一个名称和国家,是否会按照您的建议进行操作,以便当用户更改组合框中的国家/地区时,用户实例中国家属性的值也会更改?
  • 为列设置 selectedValuePath、DisplayValuePath & SelectedValueBinding

标签: c# wpf datagrid datagridcomboboxcolumn


【解决方案1】:

解决方案: 1. XAML:

<DataGrid x:Name="DataGrid" AutoGenerateColumns="False" CanUserAddRows="True">
        <DataGrid.Columns>
            <DataGridTextColumn     Header="User UName" Width="Auto" Binding="{Binding UName}"/>
            <DataGridComboBoxColumn x:Name="ComboBoxColumn" Header="Country" Width="Auto" DisplayMemberPath="name" SelectedItemBinding="{Binding CountryData}"/>
        </DataGrid.Columns>
    </DataGrid>

2。后面的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitData();
        ComboBoxColumn.ItemsSource = CountriesCollection;
        DataGrid.ItemsSource = UsersCollection;
    }

    private void InitData()
    {
        UsersCollection = new ObservableCollection<UserData>(new List<UserData>
        {
            new UserData
            {
                UName = "Greg",
            },
            new UserData
            {
                UName = "Joe",
            },
             new UserData
            {
                UName = "Iv",
            }
        });
        CountriesCollection = new ObservableCollection<Country>(new List<Country>
        {
            new Country("Ger", "1500"),
            new Country("Fra", "1500"),
            new Country("Ru", "1500"),
            new Country("Bel", "1500"),
        });
    }

    public ObservableCollection<Country> CountriesCollection { get; set; }

    public ObservableCollection<UserData> UsersCollection { get; set; }
}

3。用户模型:

 public class UserData
{
    public string UName { get; set; }

    public object CountryData { get; set; }
}

4。工具提示支持:用下一个 xaml 代码替换所需的组合框列:

 <DataGridComboBoxColumn x:Name="ComboBoxColumn" Header="Country" DisplayMemberPath="CountryName"
                                    ItemsSource="{StaticResource CountriesArray}" Width="Auto"
                                    SelectedItemBinding="{Binding CountryData, UpdateSourceTrigger=PropertyChanged}">
                <DataGridComboBoxColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ContentControl Content="{Binding }">
                                    <ContentControl.ContentTemplate>
                                        <DataTemplate DataType="{x:Type soDataGridProjectsHelpAttempt:UserData}">
                                            <DataTemplate.Resources>
                                                <system:String x:Key="NoAnyEntriesKey">
                                                    No any entry presented
                                                </system:String>
                                            </DataTemplate.Resources>
                                            <TextBlock Text="{Binding CountryData.Description, FallbackValue={StaticResource NoAnyEntriesKey}}"></TextBlock>
                                        </DataTemplate>
                                    </ContentControl.ContentTemplate>
                                </ContentControl>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGridComboBoxColumn.CellStyle>
            </DataGridComboBoxColumn>

并考虑到您需要使用描述属性扩展 Country 模型。

问候,

【讨论】:

  • 谢谢。在 Country 对象中,我有一个名称字段(现在在 datagridcombobox 中查看)和一个简短的描述,如何将 datagridcombobox 中每个国家的描述绑定到工具提示? (期望的效果是:用户将鼠标悬停在组合框中的一个选项上,并看到该 Country 对象的描述字段作为工具提示)
  • @Stacker 看看这个。
  • 我正在使用 WPF,在“DataType="{x:Type soDataGridProjectsHelpAttempt:UserData}"”上出现“WPF 不支持用户数据”错误
  • 但是,我设法做到了(在您的帮助下):我只是没有使用 DataTemplate,我将值设置为正确的绑定(CountryData.Description),谢谢。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2013-11-30
  • 2012-02-15
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多