私は、データ バインディングと INotifiedProperty インターフェイス (新しい .Net 4.5 CallerMemberName 属性を含む) を使用して遊んでいます。
すべてがうまく機能していますが、オブジェクトのプロパティを更新するとバインドされているラベルが更新されるのに、オブジェクト自体を更新してもラベルが更新されない理由がわかりません。
たとえば、次のウィンドウがあるとします。
<Grid Name="TestGrid">
<!-- Grid definitions here -->
<Label Grid.Column="0" Grid.Row="0">The value is :</Label>
<Label Grid.Column="1" Grid.Row="0" Content="{Binding TestVal1}"/>
<Button Grid.Column="0" Grid.Row="1" Click="Button_Click_1">Refresh</Button>
<Button Grid.Column="1" Grid.Row="1" Click="Button_Click_2">New class instance</Button>
</Grid>
その背後にある次のコードを使用します。
public MainWindow()
{
InitializeComponent();
TestGrid.DataContext = TestClass1;
}
public TestClass TestClass1 = new TestClass();
private void Button_Click_1(object sender, RoutedEventArgs e)
{
TestClass1.ChangeTestVal1();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
TestClass1 = new TestClass();
}
次のクラスにバインドされています。
public class TestClass : INotifyPropertyChanged
{
public TestClass()
{
ChangeTestVal1();
}
public event PropertyChangedEventHandler PropertyChanged;
internal void OnPropertyChanged([CallerMemberName] String caller = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(caller));
}
}
private string _TestVal1;
public string TestVal1
{
get { return _TestVal1; }
set
{
if (value != _TestVal1)
{
_TestVal1 = value;
OnPropertyChanged();
}
}
}
public void ChangeTestVal1()
{
TestVal1 = "TestVal1 = " + DateTime.Now.ToString("dd-MMM-yyyy HH:mm:ss");
}
その結果、[更新] ボタンをクリックしても機能し、[新しいクラス インスタンス] をクリックしても機能しません。
私の質問は、「TestGrid.DataContext = TestClass1」をコードに追加して 2 番目のボタンを機能させることができることはわかっていますが、更新時に TestClass のインスタンスが変化することを確実に検出する必要がありますか? バインドの設定が間違っていませんか?