如何为所有组合框创建通用的选定项

本文关键字:创建 组合 | 更新日期: 2023-09-27 18:15:43

我是WPF的新手。

我试图使SelectedItem为所有的组合框通用,因为有很多的组合框在我的表单。

当我为每个组合框使用不同的SelectedItem时,效果很好。

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_DeviceTypeMySelectedItem_All在我的XAML。它抛出一个异常。

谢谢,

如何为所有组合框创建通用的选定项

听起来你需要抽象一点,并有一个类来包装你试图通过组合框选择项设置的所有这些属性。

例如

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} />

你仍然需要在某个地方的属性,但不是不同范围的VM属性,你认识到这些属性都是一个更大的内聚类的一部分。