Я бы написать DeviceOptionViewModel
, и придают главному ViewModel в ObservableCollection.
DeviceOptionViewModel.cs
public class DeviceOptionViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _currentDevice;
public String CurrentDevice {
get { return _currentDevice; }
set {
_currentDevice = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(CurrentDevice));
}
}
// Parent event assigns this to his own availableDevices
// when he creates this.
public IEnumerable AvailableDevices { get; set; }
}
Главная VM:
public ObservableCollection<DeviceOptionViewModel>
CurrentDevices { get; private set; }
= new ObservableCollection<DeviceOptionViewModel>();
XAML:
<ItemsControl
ItemsSource="{Binding CurrentDevices}"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- DataContext here is DeviceOptionViewModel. We gave it its
own reference to AvailableDevices to simplify binding. -->
<ComboBox
ItemsSource="{Binding AvailableDevices}"
SelectedValue="{Binding CurrentDevice}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Перейти к основному ViewModel:
protected void PopulateCurrentDevices(IEnumerable<String> stringsFromWherever)
{
CurrentDevices.Clear();
foreach (var device in stringsFromWherever)
{
var dovm = new DeviceOptionViewModel() {
CurrentDevice = device,
AvailableDevices = this.availableDevices
};
dovm.PropertyChanged += DeviceOptionViewModel_PropertyChangedHandler;
CurrentDevices.Add(dovm);
}
}
protected void DeviceOptionViewModel_PropertyChangedHandler(object sender,
PropertyChangedEventArgs e)
{
var dopt = sender as DeviceOptionViewModel;
if (e.PropertyName == nameof(DeviceOptionViewModel.CurrentDevice))
{
// Do stuff
}
}
Таким образом, вы заполняете и повторно заполняете CurrentDevices
в своей модели просмотра по мере необходимости, и пользовательский интерфейс будет волшебным образом появляться, если все уведомления будут выполнены правильно.
Если вы создаете новый ObservableCollection
и присваиваете это собственности CurrentDevices
, вам нужно поднять PropertyChanged(nameof(CurrentDevices))
на главной модели. Я сделал приватного сеттера, чтобы избежать необходимости выполнять эту деталь. Если это не огромная коллекция, может быть только Clear()
и Add()
на том же старом экземпляре.
Есть ли всегда три устройства? Наверное, этого не стоит. Кроме того, это не CamelCased, имена также ужасны. Я просто буду сидеть здесь, предполагая, что вы переименовали их для целей задавания этого вопроса. – Will
нет, будет число переменных устройств. и я также переименовал их для простоты. –
Тогда ответ Эд - это хороший способ сделать это. – Will