Как сделать общий 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} />
Вам по-прежнему понадобятся свойства где-то, но вместо разрозненного диапазона свойств виртуальной машины вы признаете, что все эти свойства являются частью большего связного класса.