Как сделать общий SelectedItem для всех ComboBox

Я новичок в WPF.

Я пытаюсь сделать SelectedItem для всех комбинированных списков универсальными, так как в моей форме много ComboBox.

Когда я использую разные SelectedItem для каждого ComboBox, он работает нормально.

Код C#:

private DropDownModel _mySelectedItem_DeviceType;
    public DropDownModel MySelectedItem_DeviceType
    {
        get { return _mySelectedItem_DeviceType; }
        set
        {
            if (_mySelectedItem_DeviceType != value)
            {
                _mySelectedItem_DeviceType = value;

                OnNotifyPropertyChanged("MySelectedItem_DeviceType");
            }
        }
    }
 private DropDownModel _mySelectedItem_All;
    public DropDownModel MySelectedItem_All
    {
        get { return _mySelectedItem_All; }
        set
        {
            if (_mySelectedItem_All != value)
            {
                _mySelectedItem_All = value;

                OnNotifyPropertyChanged("MySelectedItem_All");
            }
        }
    }

    private DropDownModel _mySelectedItem_Status;
    public DropDownModel MySelectedItem_Status
    {
        get { return _mySelectedItem_Status; }
        set
        {
            if (_mySelectedItem_Status != value)
            {
                _mySelectedItem_Status = value;

                OnNotifyPropertyChanged("MySelectedItem_Status");
            }
        }
    }
public event PropertyChangedEventHandler PropertyChanged;

    private void OnNotifyPropertyChanged(string propertyName)
    {
        var propertyChangedEvent = PropertyChanged;  

        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    } 
var myListDropDown = (from b in _entities.DeviceTypes
                                  select new DropDownModel
                                  {
                                      ID = b.ID,
                                      Name = b.Name
                                  }).Distinct().ToList();
            myListDropDown.Add(new DropDownModel
            {
                ID = -1,
                Name = "Select Device"
            });
            myListDropDown = myListDropDown.OrderBy(x => x.Name).ToList();

            //DisplayDeviceType = new ObservableCollection<DropDownModel>(myListDropDown);
            DisplayDeviceType = new ObservableCollection<DropDownModel>(myListDropDown);

            MySelectedItem_DeviceType = (from b in myListDropDown
                                               where b.ID == (singleDevice == null ? -1 : singleDevice.DeviceTypeID)
                                               select b).FirstOrDefault();
var allStatus = (from b in _entities.DeviceStatuses
                               select new DropDownModel
                               {
                                   ID = b.ID,
                                   Name = b.Status
                               }).Distinct().ToList();
            allStatus.Add(new DropDownModel
            {
                ID = -1,
                Name = "Select Status"
            });
            allStatus = allStatus.OrderBy(x => x.Name).ToList();

            Status = new ObservableCollection<DropDownModel>(allStatus);

            MySelectedItem_Status = (from b in allStatus
                                  where b.ID == (singleDevice == null ? -1 : singleDevice.StatusID)
                                  select b).FirstOrDefault();

XAML:

 <ComboBox Name="DeviceTypeComboBox"
                              Grid.Column="1"
                              HorizontalAlignment="Left"
                              VerticalAlignment="Top"
                              Width="143.917"
                              Grid.Row="1"
                              ItemsSource="{Binding DisplayDeviceType}"
                              SelectedItem="{Binding MySelectedItem_DeviceType}"
                              SelectedValue="ID"
                              SelectedValuePath="ID"
                              DisplayMemberPath="Name"

                              />
<ComboBox Name="StatusTypeComboBox"
                              HorizontalAlignment="Left"
                              VerticalAlignment="Top"
                              Width="143.917"
                              Grid.Column="4"
                              Grid.Row="1"
                              ItemsSource="{Binding Status}"
                              SelectedItem="{Binding MySelectedItem_Status}"
                              SelectedValue="ID"
                              SelectedValuePath="ID"
                              DisplayMemberPath="Name"
                              />

// Работает отлично

Но когда я пытаюсь заменить MySelectedItem_Status & MySelectedItem_DeviceType с MySelectedItem_All в моем XAML. Это бросает исключение.

Спасибо,

1 ответ

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

Например

public class DeviceInfo
{
  private DeviceDisplayType deviceType;
  public DeviceDisplayType DeviceType
  {
    get { return deviceType; }
    set { deviceType = value; }
  }

  private DeviceStatus deviceStatus
  public DeviceStatus DeviceStatus
  {
    get { return deviceStatus; }
    set { deviceStatus = value; }
  }
}

И тогда есть один из них DeviceInfo объекты в вашей модели представления, и сделайте xaml привязанным к этим свойствам напрямую.

<ComboBox SelectedItem={Binding MyDeviceInfo.DeviceType} />

Вам по-прежнему понадобятся свойства где-то, но вместо разрозненного диапазона свойств виртуальной машины вы признаете, что все эти свойства являются частью большего связного класса.

Другие вопросы по тегам