2016-04-22 16 views
1

Ist es möglich, die currentDevices in eine Sammlung umzuwandeln? Grundsätzlich habe ich drei Comboboxen, in denen der ausgewählte Wert an currentDevices gebunden ist. dann werden die currentDevices aus einer Einstellungsdatei übernommen.Ansicht von ViewModel zu Einstellungen

Ansicht

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

Ansichtsmodell

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

Gibt es immer drei Geräte? Wahrscheinlich nicht wert. Abgesehen davon, dass es nicht CamelCased ist, sind die Namen auch schrecklich. Ich werde nur hier sitzen, vorausgesetzt, Sie haben sie umbenannt, um diese Frage zu stellen. – Will

+0

nein, es wird eine variable Anzahl von Geräten geben. und ich habe sie auch einfach umbenannt. –

+0

Dann ist die Antwort von Ed unten ein guter Weg, es zu tun. – Will

Antwort

2

würde ich ein DeviceOptionViewModel, schreiben und dem Hauptansichtsmodell ein ObservableCollection geben.

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

Haupt 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> 

Zurück zur Hauptansichtsmodell:

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

Sie füllen und repopulate CurrentDevices in Ihrem ViewModel wie erforderlich, und die Benutzeroberfläche wird magisch erscheinen, wenn alle Benachrichtigungen korrekt ausgeführt werden.

Wenn Sie eine neue ObservableCollection erstellen und diese der Eigenschaft CurrentDevices zuweisen, müssen Sie PropertyChanged(nameof(CurrentDevices)) auf dem Hauptansichtmodell erhöhen. Ich habe den Setter privat gemacht, um das Detail nicht umsetzen zu müssen. Wenn es keine riesige Sammlung ist, können auch nur Clear() und Add() auf der gleichen alten Instanz.

+0

Habe es gerade funktioniert! Vielen Dank! –

+0

@PaoloGo Mein Vergnügen! –