c# - 将 DatagridComboboxColumn 绑定(bind)到集合

标签 c# wpf xaml mvvm binding

我有这个 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>

我希望组合框绑定(bind)到我的角色集合
我的模型
public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Role { get; set; }
}


在我的 View 模型中:
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; }

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

最佳答案

以下代码演示了一种绑定(bind) 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>

和 ViewModel
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

关于c# - 将 DatagridComboboxColumn 绑定(bind)到集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61518801/

相关文章:

c# - 如何知道 GraphicsPath 是否包含 C# 中的一个点

wpf - 如何将 Microsoft Edge WebView2 Runtime 添加为先决条件

c# - "Prefix ' x ' does not map to a namespace"

c# - 防止属性被序列化

c# - Silverlight 使用转换器在 ListView 中绑定(bind)对象

c# - Visual Studio 2015 中的 1.0.0-beta

c# - ASP.NET C# 代码中的互斥释放问题

c# - 将 DataGrid 单元格绑定(bind)到索引属性

c# - 如何在 EmguCv 中使用 OpenCv 3.0 CvInvoke.HoughLines 方法

wpf - 为什么在我的 WPF View 中标签控件的内容文本不可见?