C#2010でPro WPFを読んでいる間、著者は次のように書いています。
「プロパティごとにイベントを発生させることができます。この場合、イベントの名前はPropertyNameChanged(たとえば、UnitCostChanged)である必要があります。プロパティが変更されたときにイベントを発生させるのはあなた次第です。」
誰かがこの機能が機能することを確認できますか?私は実験していて、この動作を再現できませんでした(これが機能するかどうかを確認したいので、System.Reflection.Emitを使用して動的タイプを作成できます)
編集:ここで強調するのは、INotifyPropertyChangedを実装せずに変更通知を実装することです。これは、本が主張していることです。
これが私がテストしているPOCOです:
public class Employee
{
private string _FirstName;
public string FirstName
{
get
{
return _FirstName;
}
set
{
if (_FirstName != value)
{
_FirstName = value;
if (FirstNameChanged != null)
{
FirstNameChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
}
}
}
これをDataGridにバインドし、バックグラウンドでタイマーを使用してFirstNameプロパティを数秒ごとにランダムに更新しましたが、DataGridが起動することはありません
<DataGrid x:Name="dgEmployees" ItemsSource="{Binding ElementName=mainWindow, Path=MyEmployees}">
<DataGrid.Columns>
<DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
</DataGrid.Columns>
</DataGrid>
FirstNameChangedイベントは常にnullです(命名規則に従って検出された場合、バインディングエンジンが自動的にサブスクライブする可能性があると思いました)。MyEmployeesは単なるObservableCollectionです
誰かがこの機能が作者が言及しているかどうか、実際に機能しているかどうか、そして私が間違いを犯しているかどうかを確認できますか?
編集:私がテキストを誤解していると思う人のために:
「この問題を解決するには、次の3つのアプローチを使用できます。
第4章で学習した構文を使用して、Productクラスの各プロパティを依存関係プロパティにすることができます(この場合、クラスはDependencyObjectから派生する必要があります)。 )、それは要素、つまりウィンドウに視覚的に見えるクラスで最も意味があります。これは、Productのようなデータクラスにとって最も自然なアプローチではありません。
プロパティごとにイベントを発生させることができます。この場合、イベントの名前はPropertyNameChanged(たとえば、UnitCostChanged)である必要があります。プロパティが変更されたときにイベントを発生させるのはあなた次第です。
System.ComponentModel.INotifyPropertyChangedインターフェイスを実装できます。これには、PropertyChangedという名前の単一のイベントが必要です。次に、プロパティが変更されるたびにPropertyChangedイベントを発生させ、プロパティ名を文字列として指定して、変更されたプロパティを示す必要があります。プロパティが変更されたときにこのイベントを発生させるのはあなた次第ですが、プロパティごとに個別のイベントを定義する必要はありません。」