2016-04-22 2 views
1

Можно ли реорганизовать текущие файлы в коллекцию? В принципе, у меня есть три комбобокса, в которых выбранное значение привязано к currentDevices. то текущиеDevices берутся из файла настроек.View to ViewModel to Settings

Посмотреть

<ComboBox ItemsSource="{Binding availableDevices}" 
      SelectedValue="{Binding currentDevice1}"> 
</ComboBox> 
<ComboBox ItemsSource="{Binding availableDevices}" 
      SelectedValue="{Binding currentDevice2}"> 
</ComboBox> 
<ComboBox ItemsSource="{Binding availableDevices}" 
      SelectedValue="{Binding currentDevice3}"> 
</ComboBox> 

ViewModel

public string currentDevice1 { 
    get 
    { 
     return SampleSettings.Default.Device1; 
    } 
    set 
    { 
     SampleSettings.Default.Device1 = value; 
    } 

} 
public string currentDevice2 
{ 
    get 
    { 
     return SampleSettings.Default.Device2; 
    } 
    set 
    { 
     SampleSettings.Default.Device2 = value; 
    } 
} 
public string currentDevice3 
{ 
    get 
    { 
     return SampleSettings.Default.Device3; 
    } 
    set 
    { 
     SampleSettings.Default.Device3 = value; 
    } 
} 
+0

Есть ли всегда три устройства? Наверное, этого не стоит. Кроме того, это не CamelCased, имена также ужасны. Я просто буду сидеть здесь, предполагая, что вы переименовали их для целей задавания этого вопроса. – Will

+0

нет, будет число переменных устройств. и я также переименовал их для простоты. –

+0

Тогда ответ Эд - это хороший способ сделать это. – Will

ответ

2

Я бы написать 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() на том же старом экземпляре.

+0

Просто он работает! Большое спасибо! –

+0

@PaoloGo Мое удовольствие! –

Смежные вопросы