Привязка данных ComboBox к SelectedItem в DataGrid - PullRequest
1 голос
/ 21 ноября 2011

Я уже давно ищу решение своей проблемы, поэтому сейчас я просто собираюсь опубликовать здесь некоторый код!

Я использую MVVM для обработки данных в своем приложении иПроблема касается следующих двух классов ViewModel

public class vmProject : vmBase
{
private Project project;


public User Owner
{
    get { return project.Owner; }
    set {project.Owner = value; OnPropertyChanged("Owner"); }
}


public vmProject(Project project)
{
    this.project = project;
}

}

public class User
{
public int Id { get; set; }
public string ShortName { get; set; }
public string FullName { get; set; }
}

. Я загружаю все проекты в ObservableCollection, а всех пользователей - в ObservableCollection.Теперь я хочу показать все проекты в DataGrid с ComboBox, отображающим ShortName пользователя.В сетке данных также должен быть текстовый столбец для отображения полного имени владельца.

Моя проблема в том, что я не могу понять, должен ли я использовать DataGridComboBoxColumn или DataGridTemplateColumn.И как использовать привязку данных в каждом из них ...

Когда пользователь выбирает нового владельца в поле со списком, модель должна быть обновлена, а также столбец FullName.

IsЕсть ли решение для этого?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Вот пример, который использует ComboBox в столбце Template.Предполагается, что ваш UserCollection является частью того же DataContext, который содержит ProjectsCollection

<DataGridColumn>
    <DataGridColumn.Template>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding 
                          RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                          Path=DataContext.UserCollection}"
                      SelectedValue="{Binding Owner}"
                      DisplayMemberPath="ShortName" />
        </DataTemplate>
    </DataGridColumn.Template>
</DataGridColumn>

Когда WPF сравнивает объекты для SelectedValue, он сравнивает их по ссылке.Таким образом, если ваш User объект в каждом свойстве не является той же ссылкой в ​​памяти, что и ваш UserCollection, это значение вернет false и элемент не будет выбран.Одним из способов решения этой проблемы является перезапись .ToString() метода класса User, чтобы элементы считались равными, если их поля идентификаторов совпадают.

Другой способ - использовать SelectedValuePath и связать SelectedValue с универсальным типом данных, таким как поле int UserId.

<ComboBox ItemsSource="{Binding 
               RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
               Path=DataContext.UserCollection}"
          SelectedValue="{Binding Owner.Id}"
          SelectedValuePath="Id"
          DisplayMemberPath="ShortName" />
0 голосов
/ 22 ноября 2011

Я не перон MVVM, но именно так я бы и сделал без MVVM. Не думайте, что вам нужен UsersFiltered и ObservableCollection. Если UsersAll является коллекцией Observable, она выберет новые строки при выборе нового имени.

 bind the grid to a filtered list 


 public List<User> UsersFiltered 
 {
    get
    {
         return UsersAll.Where(usr => user = SelectedCBUser).ToList();
    }
 {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...