Dies ist die Architektur, die ich implementiert habe.Zweifel an der MVVM-Implementierung
Grundsätzlich möchte ich die Option „Zellen“ in View 2 und „Orte“ wird von der ausgewählten Zelle aufgefüllt werden. Dann habe ich Combo-Box mit "Systemen" und ich möchte nach der Systemauswahl, verschiedene Sätze von Zellen bevölkern. Dafür benutze ich IOC, um auf ein anderes Ansichtsmodell zuzugreifen.
Zweifel ist, ob ich nach MVVM Muster implementiert habe. Der Teil mit UpdateModel
sieht mir nicht so gut aus. Ich würde mich freuen, wenn jemand die Architektur überprüfen und mir sagen könnte, was ich besser hätte machen können. Ist es auch richtig, Modellinstanzen im View-Modell zu haben, oder sollte ich Datendienstmuster verwenden, wie in mvvm-light boilerplate?
Frage: Kann ich die Reaktion auf Systemänderungen implementieren, ohne die UpdateModel-Funktion aufzurufen, sondern mithilfe der nativen Mechanismen von mvvm-light ViewModel2 zu aktualisieren?
Nachfolgend einige wichtige Teile des Codes.
ViewModel2:
public List<string> LocationList
{
get
{
var cells = _wList.GetCells(currentSystemNumber);
var cell = cells[_selectedCellItem.Key];
return cell.Locations;
}
}
private KeyValuePair<int, string> _selectedCellItem;
public KeyValuePair<int, string> SelectedCellItem
{
get
{
return _selectedCellItem;
}
set
{
Set(ref _selectedCellItem, value);
RaisePropertyChanged("LocationList");
}
}
public ObservableCollection<KeyValuePair<int, string>> CellList
{
get
{
int count = _wList.GetCells(currentSystemNumber).Count;
ObservableCollection<KeyValuePair<int, string>> cells = new ObservableCollection<KeyValuePair<int, string>>();
for(int i = 0; i < count; i++)
cells.Add(new KeyValuePair<int, string>(i, string.Format("Cell {0}/{1}", i, currentSystemNumber+1)));
return cells;
}
}
public void UpdateModel(int system)
{
currentSystemNumber = system;
RaisePropertyChanged("CellList");
RaisePropertyChanged("LocationList");
}
View2:
<Grid>
<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="104" Margin="121,32,0,0" VerticalAlignment="Top" Width="144" ItemsSource="{Binding LocationList}"/>
<ListBox x:Name="listBox1" HorizontalAlignment="Left" Height="104" Margin="10,32,0,0" VerticalAlignment="Top" Width="102" ItemsSource="{Binding CellList}" SelectedItem="{Binding SelectedCellItem}" DisplayMemberPath="Value"/>
<Label x:Name="label" Content="Cells" HorizontalAlignment="Left" Margin="10,1,0,0" VerticalAlignment="Top"/>
<Label x:Name="label1" Content="Locations" HorizontalAlignment="Left" Margin="121,1,0,0" VerticalAlignment="Top"/>
</Grid>
ViewModel1:
private ObservableCollection<KeyValuePair<int, string>> _systems = new ObservableCollection<KeyValuePair<int, string>>();
public ObservableCollection<KeyValuePair<int, string>> Systems
{
get
{
return _systems;
}
}
private KeyValuePair<int, string> _selectedSystemItem;
public KeyValuePair<int, string> SelectedSystemItem
{
get
{
return _selectedSystemItem;
}
set
{
Set(ref _selectedSystemItem, value);
var locator = (ViewModelLocator)Application.Current.Resources["Locator"];
var vm = locator.DASrvPageVM;
vm.UpdateModel(value.Key);
}
}
Das Ändern von 'KeyValuePair' in' Tuple' löste das Problem. Einzige Sache ist, sicherzustellen, dass meine Architektur keine stinkigen Plätze hat. – Pablo