Значение привязки к ComboBox WPF - PullRequest
0 голосов
/ 06 января 2019

Итак, мне нужно создать приложение WPF, которое будет принимать значения из списка и сохранять их в DataGrid. У меня есть 3 поля, которые я хочу показать в сетке: Имя пользователя, FullName и Роль. Теперь Роль может иметь 2 значения: покупатель и поставщик. Как мне сделать эту часть DataGridTemplate? Кроме того, как выбрать правильную нагрузку для каждого пользователя? Пустая строка - это место, где должен быть отсутствующий код. Вот код, над которым я работаю:

<Grid>
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding UserList}" Name="dgUsers" HorizontalAlignment="Left" Height="450" Width="400">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Username" Width="100" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Username}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Full Name" Width="200" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding FullName}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Role" Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

EDIT:

В качестве DataTemplate я сделал это:

<DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
            <ComboBox ItemsSource="{Binding valueList}" SelectedIndex="{Binding Role}"/>
     </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Как роль, внутри конструктора я сделал это:

public class UserToChange
{
    public string Username { get; set; }
    public string FullName { get; set; }
    public int Role { get; set; }
    public List<string> valueList { get; set; }

    public UserToChange()
    {

    }

    public UserToChange(UserVM row)
    {
        Username = row.UserName;
        FullName = row.FirstName + " " + row.LastName;
        Role = row.RoleId == 102 ? 0 : 1;
        valueList = new List<string>
        {
            "Supplier",
            "Shopper"
        };
    }
}

И это сработало. Теперь мне нужно запрограммировать логику для обновления базы данных, но я могу справиться с этим. Спасибо всем!

Ответы [ 2 ]

0 голосов
/ 07 января 2019
  1. Сначала заполните коллекцию ListofRole соответствующими значениями.
  2. Свяжите его со списком внутри DataGridTemplateColumn.
  3. Свяжите свойство SelectedValue поля со списком, и, когда дело доходит до магии, свяжите SelectedValue с той переменной, которая содержит значение Role в dataList.

    Примечание: коллекция ListofRole не должна быть пользовательского типа, тогда нам нужно добавить еще несколько параметров в поле со списком, это должен быть обычный тип строки.

             <DataGridTemplateColumn Header="Role" Width="0.45*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding ListOfRole}" 
                                      SelectedValue="{Binding Role,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    
0 голосов
/ 06 января 2019

Вы можете связать Коллекцию двумя способами.

1) Создать ComboBox внутри DataTemplate

         <DataGridTemplateColumn Header="Role" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding dataList}"  Width="100" DisplayMemberPath="{Binding DisplayProperty}" SelectedValuePath="{Binding PropertyId}" SelectedIndex="0" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

Для ComboBox, используйте SelectedIndex, чтобы установить элемент по умолчанию при загрузке.

2) Вместо DataGridTemplateColumn используйте DataGridComboBoxColumn

<DataGridComboBoxColumn ItemsSource="{Binding dataList}" Width="100" Header="Role2" DisplayMemberPath="{Binding DisplayProperty}" SelectedValuePath="{Binding PropertyId}" SelectedItemBinding="{Binding DefaultValuePro, Mode=TwoWay}" />

Для DataGridComboBoxColumn используйте SelectedItemBinding, свяжите его со свойством, чтобы установить значение по умолчанию.

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