これは、WPF/C#でBindingを使用するための一般的なINotifyPropertyChanged実装です。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));
}
}
}
}
私もCheckBoxState
に結合したXAMLコードを持っています。
<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>
これは、DataContextのとモデルの間でリンクするMainWindow.xaml.csです。ユーザーがチェックボックスを設定すると
public partial class MainWindow : Window
{
notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = model;
}
}
、私は次のように何起こることだと思う:IsChecked
は真となり、そして"{Binding Path=CheckBoxState, Mode=TwoWay}"
で、CheckBoxState
プロパティがRaisePropertyChanged()
し、それに応じてPropertyChanged()
を呼び出すことが真になります。このファンクションのパラメータはCheckBoxState
であるため、パスCheckBoxState
を持つすべてのバインディングは、自身を更新するように通知されます。
- このコールはどのようにアクティブになりますか
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
?それを可能にするために、この背後にあるC#の魔法は何ですか? - なぜ
if (PropertyChanged != null)
が必要ですか? PropertyChangedをどのような値に設定しますか? Mode=TwoWay
の意味は、変更を伝えるだけでなく、同じ名前のバインディング要素が変更されたときにコンテンツを更新するように見えます。次に、OneWayモードはどうなりますか?バインディングをソースのみまたはターゲットのみとして設定できますか?
私は唯一のコントロールが読み込まれるときに、一度更新ワンタイムバインディングモードもあります信じています。 – Yuf
@Yuf:良い点:私はそれを私の答えに加えます。 –
この行はどのように動作しますか?PropertyChanged(this、new PropertyChangedEventArgs(propertyName)); – RSB