Cześć,
mam pytanie dotyczące prawidłowego podejścia do pewnego zagadnienia…
Mam dwie kontrolki, załóżmy że ComboBox oraz GroupBox, który domyślnie jest zablokowany (rodzaj kontrolek wybrałem tylko dla przykładu). W momencie wybrania elementu w ComboBox następuje odblokowanie GroupBox.
Efekt osiągnąłem na dwa sposoby i teraz zastanawiam się, który jest tym “jedynym słusznym”
Piszę z palca, więc przepraszam za ewentualne literówki w kodzie.
Podejście 1
w widoku - w XAMLu - mam:
<ComboBox ItemsSource="{Binding Path=carsList}" SelectedItem="{Binding Path=CarSelection}"/>
<GroupBox x:Name="groupBoxCar" IsEnabled="{Binding Path=GroupBoxCarIsEnabled}">...</GroupBox>
W ViewModels mam plik MainWindowViewModel.cs, który implementuje INotifyPropertyChanged. Mam w nim dwie metody:
private string _carSelection;
public string CarSelection
{
get { return _carSelection; }
set
{
_carSelection = value;
GroupBoxCarIsEnabled = true;
}
}
private bool _groupBoxCarIsEnabled = false;
public bool GroupBoxCarIsEnabled
{
get { return _groupBoxCarIsEnabled; }
set
{
_groupBoxCarIsEnabled = value;
OnPropertyChanged();
}
}
W momencie wybrania dowolnego elementu w ComboBox wywołuje się CarSelection, który z kolei zmienia _groupBoxCarIsEnabled na “true”. Odpowiednia właściwość jest bindowana do IsEnabled w kontrolce GroupBox. O zmianach informuję za pomocą OnPropertyChanged.
Super, wszystko działa Na obecny poziom mojej wiedzy jest to zgodne z MVVM
Podejście 2
W widoku mam:
[ComboBox ItemsSource="{Binding Path=carsList}" SelectedItem="{Binding Path=CarSelection}"/]
[GroupBox x:Name="groupBoxCar" IsEnabled="false">...</GroupBox]
Różnica jest taka, że nie mam bindowania w kontrolce GroupBox.
W ViewModel mam:
MainWindow mainWindow = Application.Current.MainWindow as MainWindow;
private string _carSelection;
public string CarSelection
{
get { return _carSelection; }
set
{
_carSelection = value;
mainWindow.groupBoxCar.IsEnabled = true;
}
}
I też wszystko działa. Jest jednak mniej kodu - nie ma właściwości, która była bindowana w GroupBox.
Dobrałem się do kontrolki po jej nazwie i zmieniłem IsEnabled na true.
Wydaje mi się, że tutaj również wszystko jest zgodnie z MVVM.
…tak więc, które podejście jest lepsze? A może nie ma żadnej różnicy?