Привязка выбранного элемента WPF Combobox - PullRequest
0 голосов
/ 20 июня 2020

У меня следующая проблема. У меня есть эти модели:

public class A
{
    public A(string id)
    {
        ID = id;
        
    }

    public string ID { get; }
    public string Name { get ; set; }
    public B objectB { get; set; }

}

public class B
{
    public B(string id)
    {
        ID = id;
    }

    public string ID { get; }
    public string Name { get; set; }
}

public class ViewModel
{
    public ObservableCollection<A> ListOne = new ObservableCollection<A>();
    public ObservableCollection<B> ListTwo = new ObservableCollection<B>();

    public ViewModel()
    {
        B objectB = new B("1");
        objectB.Name = "ObjectB";

        B listElement2 = new B("2");
        listElement2.Name = "ListElement2";

        ListTwo.Add(objectB);
        ListTwo.Add(listElement2);

        A objectA = new A("A1");
        objectA.Name = "objectA1";
        objectA.objectB = objectB;

        ListOne.Add(objectA);
    }
}

<ListBox ItemsSource="{Binding ListOne}" Name="MyListBox">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <ComboBox ItemsSource="{Binding ElementName=MyListBox, Path=DataContext.ListTwo}" 
                  DisplayMemberPath="Name" 
                  SelectedItem="{Binding objectB}"/>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Class A содержит объект ob Class B. Мой ViewModel содержит два списка. Один список (ListOne) объектов класса A, а второй список (ListTwo) содержит объекты класса B.

Теперь я хочу привязать listTwo к combobox, который встроен в listbox. listbox отображает все объекты в listOne моделях просмотра. Если я изменю выбор combobox, я хочу обновить свойство objectB выбранного элемента списка. Я также хочу, чтобы combobox выбирал значение objectB во время инициализации.

Обратите внимание: я упростил модель и модель просмотра, чтобы сосредоточиться на проблеме. NotifyProperties и тд работает. Интересует привязка выпадающего списка.

Понятия не имею. Надеюсь, вы мне поможете.

1 Ответ

0 голосов
/ 20 июня 2020

Вы можете сделать следующее:

<ComboBox
    ItemsSource="{Binding ListB}"
    SelectedItem="{Binding SelectedB}"
    DisplayMemberPath="Name" Width="100"
/>

Кроме того, вы можете добавить следующий код в вашу ViewModel:

private ObservableCollection<B> listB = new ObservableCollection<B>();
public ObservableCollection<B> ListB
{
    get { return this.listB; }
    set { this.listB = value; NotifyPropertyChanged("ListB"); }
}

private B selectedB;
public B SelectedB
{
    get { return this.selectedA; }
    set { this.selectedB = value; NotifyPropertyChanged("SelectedA"); }
}
ViewModel()
{
    //Fill your ListB with all possible values
    this.SelectedB=ListB.FirstOrDefault(x=>x.ID==A.ObjectB.ID)
}

Тогда ваши классы могут быть INotifyPropertyChanged:

public class A : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    public long ID=-1;
    private string name = "";
    public string Name
    {
        get { return this.name; }
        set
        {
            this.name = value;
            this.NotifyPropertyChanged("Name");
        }
    }
    private B objectB;
    public B ObjectB
    {
        get{return this.objectB;}
        set
        {
            this.objectB=value;
            this.NotifyPropertyChanged("B");
        }
    }

}

Я почти уверен, что вы также можете заменить SelectedB на A.ObjectB для привязки, но вам нужно будет провести несколько тестов, чтобы проверить это. Преимущество (или неудобство в зависимости от обстоятельств) состоит в том, что если вы выполняете привязку к A.ObjectB, изменения вступят в силу, как только вы измените выбранный элемент в ComboBox. Сделав так, чтобы вы могли изменить значение своего ComboBox, не изменяя напрямую свой объект A, затем при закрытии Window вы можете запросить сохранение или нет, и если да, просто выполните A.ObjectB = SelectedB.

...