Привязать DatagridComboboxColumn к коллекции - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть этот 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; }

Как я могу связать эти предметы? Кажется, проблема в том, что я не могу привязать этот способ к коллекции внутри коллекции. Я хочу реализовать следующее: у меня есть выпадающий список со списком ролей, и я могу изменить роль моего пользователя, выбрав одно из значений выпадающего списка. Upd: обновил код, потому что я понял, что делаю.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Следующий код демонстрирует возможный способ привязки 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

1 голос
/ 30 апреля 2020

Вам нужно определить свой 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 для возврата данных из вашей таблицы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...