Jest to typowy INotifyPropertyChanged realizacja za korzystanie Wiązanie w WPF/C#.Jak działa WPF INotifyPropertyChanged?
namespace notifications.ViewModel
{
class MainViewModel : INotifyPropertyChanged
{
public const string NamePropertyName = "CheckBoxState";
private bool _checkboxstate = true;
public bool CheckBoxState
{
get { return _checkboxstate; }
set
{
if (_checkboxstate == value) return;
_checkboxstate = value;
RaisePropertyChanged(NamePropertyName);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
Mam też kod XAML, który ma wiązanie z CheckBoxState
.
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" />
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
</StackPanel>
</Grid>
Jest to MainWindow.xaml.cs na związek między DataContext i modelu.
public partial class MainWindow : Window
{
notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = model;
}
}
Gdy użytkownik ustawia pole wyboru, myślę, co by się stało, jest następująca: IsChecked
staje się prawdą, a z "{Binding Path=CheckBoxState, Mode=TwoWay}"
, CheckBoxState
nieruchomość staje się prawdą zadzwonić RaisePropertyChanged()
i odpowiednio PropertyChanged()
. Jako parametr do tej funkcji jest CheckBoxState
, każdy z Binding Path CheckBoxState
jest zgłoszona aktualizowana.
- Jak to połączenie aktywuje się
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
? Jaka jest magia C#, aby to umożliwić? - Dlaczego
if (PropertyChanged != null)
konieczne? Kto konfiguruje PropertyChanged na jaką wartość? - Znaczenie
Mode=TwoWay
wygląda, że nie tylko może sygnalizować zmianę, ale także aktualizuje zawartość gdy inne Binding element o tej samej nazwie w wiązaniu zmienia, to co o trybie Oneway? Czy możemy ustawić wiązanie wyłącznie jako źródło lub cel?
wierzę, istnieje również tryb wiązania niegdyś, że tylko aktualizuje raz, w czasie, gdy kontrola jest załadowany. – Yuf
@Yuf: Dobre miejsce: dodam to do mojej odpowiedzi. –
Jak działa ta linia - PropertyChanged (this, new PropertyChangedEventArgs (propertyName)); – RSB