【问题标题】:Bind DatagridComboboxColumn to a collection将 DatagridComboboxColumn 绑定到集合
【发布时间】:2020-08-14 13:04:53
【问题描述】:

我有这个 XAML

<DataGrid ItemsSource="{Binding Users}"
          CanUserAddRows="False"
          SelectedItem="{Binding SelectedUser}"
          AutoGenerateColumns="False"
          Grid.Column="0">
    <DataGrid.Columns>
        <DataGridTextColumn Header="First name" Binding ="{Binding FirstName}"/>
        <DataGridTextColumn Header="Last name" Binding ="{Binding LastName}"/>
        <DataGridComboBoxColumn Width="*" Header="Catégorie" 
            SelectedItemBinding="{Binding Role}">
            <DataGridComboBoxColumn.ElementStyle>
                <Style>
                     <Setter Property="ComboBox.ItemsSource"
                             Value="{Binding Path=DataContext.ComboBox_Roles, 
                             RelativeSource={RelativeSource 
                             FindAncestor, AncestorType={x:Type UserControl}}}" />
                </Style>
                </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style>
                            <Setter Property="ComboBox.ItemsSource" Value="{Binding 
                             Path=DataContext.ComboBox_Roles, RelativeSource={RelativeSource 
                             FindAncestor, AncestorType={x:Type UserControl}}}" />
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>             
    </DataGrid.Columns>
</DataGrid>

我希望组合框绑定到我的角色集合
我的模型

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Role { get; set; }
}

在我的视图模型中:

public ManageUsersViewModel()
{
    _users = new ObservableCollection<User>
    {
        new User { FirstName = "First1", LastName = "Last1", Role = "Admin" },
        new User { FirstName = "Last2", LastName = "Last2", Role ="User" },
    };

    ComboBox_Roles = new ObservableCollection<string> { "ABC", "BCD", "ASDSAD" };
}

public ObservableCollection<User> Users
{
    get => _users;
    set
    {
        _users = value;
    }
}

public ObservableCollection<string> ComboBox_Roles { get; set; }

如何绑定这些物品?似乎问题是我不能以这种方式绑定到集合中的集合。我想要实现的是我有一个带有角色列表的组合框,我可以通过选择组合框的值之一来更改我的用户角色。更新:更新代码,因为我意识到我在做。

【问题讨论】:

  • 您能否更详细地说明您的目标?您希望显示列表中提供的所有值吗?
  • 这能回答你的问题吗? Binding DataGridComboBoxColumn
  • @Drreamer 我有用户列表,每个用户都有自己的角色集合(字符串)。我想使用组合框显示这些角色
  • @PavelAnikhouski 似乎不是,我已经尝试过了,但对我没有帮助
  • ComboBox 并不意味着显示值列表。它允许显示/选择列表中的一项。如果您希望一次显示多个值,那么最好使用一个简单的文本列并定义一个转换器以将所有值合并到一个字符串中。例如。如此处所示stackoverflow.com/a/345515/12797700

标签: c# wpf xaml mvvm binding


【解决方案1】:

以下代码演示了一种绑定 DataGridComboBoxColumn 的可能方法

<DataGrid ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}" AutoGenerateColumns="False">
   <DataGrid.Columns>
      <DataGridTextColumn Header="First name" Binding ="{Binding FirstName}"/>
      <DataGridTextColumn Header="Last name" Binding ="{Binding LastName}"/>
      <DataGridComboBoxColumn Width="*" Header="Catégorie" SelectedItemBinding="{Binding Role}">
         <DataGridComboBoxColumn.ElementStyle>
            <Style>
               <Setter Property="ComboBox.ItemsSource"
                        Value="{Binding Path=DataContext.ComboBox_Roles, 
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
            </Style>
         </DataGridComboBoxColumn.ElementStyle>
         <DataGridComboBoxColumn.EditingElementStyle>
            <Style>
               <Setter Property="ComboBox.ItemsSource" 
                        Value="{Binding Path=DataContext.ComboBox_Roles, 
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
            </Style>
         </DataGridComboBoxColumn.EditingElementStyle>
      </DataGridComboBoxColumn>
   </DataGrid.Columns>
</DataGrid>

还有视图模型

public class User {
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Role { get; set; }
}
public class ManageUsersViewModel {
   public ManageUsersViewModel() {
      Users = new ObservableCollection<User>      {
                  new User { FirstName = "First1", LastName = "Last1", Role = "Admin" },
                  new User { FirstName = "Last2", LastName = "Last2", Role ="User" }};
      ComboBox_Roles = new ObservableCollection<string> { "Admin", "User", "Other" };
   }
   public ObservableCollection<User> Users { get; set; }
   public ObservableCollection<string> ComboBox_Roles { get; set; }
}

一个测试项目:https://github.com/Drreamer/GridComboBox

【讨论】:

    【解决方案2】:

    您需要像这样定义 DataGridComboBoxColumn:

    <DataGridComboBoxColumn Width="*" Header="Catégorie" 
                            SelectedItemBinding="{Binding Roles}">
      <DataGridComboBoxColumn.ElementStyle>
        <Style>
          <Setter Property="ComboBox.ItemsSource" Value="{Binding 
                       Path=DataContext.ComboBox_Roles, RelativeSource={RelativeSource 
                       FindAncestor, AncestorType={x:Type UserControl}}}" />
        </Style>
      </DataGridComboBoxColumn.ElementStyle>
      <DataGridComboBoxColumn.EditingElementStyle>
        <Style>
          <Setter Property="ComboBox.ItemsSource" Value="{Binding 
                       Path=DataContext.ComboBox_Roles, RelativeSource={RelativeSource 
                       FindAncestor, AncestorType={x:Type UserControl}}}" />
        </Style>
      </DataGridComboBoxColumn.EditingElementStyle>
    </DataGridComboBoxColumn>
    

    使用(在您的虚拟机中):

    public ManageUsersViewModel()
    {
        ComboBox_Roles= new ObservableCollection<string>(getCategoryListeSource());
    
        _users = new ObservableCollection<User>
        {
            new User { FirstName = "First1", LastName = "Last1", Roles = "Admin", },
            new User { FirstName = "Last2", LastName = "Last2", Roles = "User", },
        }; // populating to test
    }
    
    #region Properties
    public ObservableCollection<string> Roles { get; set; }
    
    private ObservableCollection<User> _users;
    public ObservableCollection<User> Users
    {
        get => _users;
        set
        {
            _users = value;
        }
    }
    #endregion Properties
    
    #region Private Method
    private List<string> getCategoryListeSource()
    {
        List<string> list = new List<string>();
    
        liste.Add("User");
        liste.Add("Admin");
    
        return list;
    }
    #endregion Private Method
    

    类:User.cs

    public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        //public ObservableCollection<string> Roles { get; set; } REMOVE THIS
    }
    

    然后,您可以使用 SelectedUser 属性从数据网格返回数据。

    【讨论】:

    • 所以我定义了公共属性 ComboBox_Roles,并对其进行了初始化,但是当我打开我的组合框时,它仍然没有任何项目。
    • 我修改了我的答案。我在 VM 中重新定义了你的两个 ObservableCollection。我没有编译这段代码。
    • 我做了一些更新,正如我在更新问题中提到的那样。你的方法是正确的,但由于某种原因对我不起作用。但是您的代码帮助我解决了绑定问题,谢谢。
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2011-07-10
    • 2011-12-21
    • 2020-09-27
    • 2018-03-12
    • 2013-04-24
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多