監視可能なコレクションの更新に関して質問があります。Visual Studio 2010 c# を使用しています。私は比較的初心者であり、壊滅的なエラーを犯した可能性があるため、開始することをお詫びします. 基本的に、このコードは Windows 7 で実行すると完全に機能しますが、Windows 8 ではNullReferenceException
on PropertyChanged を取得します。
Tasks オブザーバブル コレクションを保持するクラスがあります。
Tasks.cs
namespace TimeLocation
{
public static class TStatic
{
static TStatic()
{
TaskList = new ObservableCollection<Tasks>();
}
public static ObservableCollection<Tasks> TaskList { set; get; }
}
public class Tasks : INotifyPropertyChanged
{
public int taskID;
public string taskname;
public Tasks(string tname)
{
this.taskname = tname;
}
public string Taskname
{
get { return taskname; }
set
{
if (value != "")
{
taskname = value; OnPropertyChanged("Taskname");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string info)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(info));
}
}
}
MainWindow に Tasks にバインドされたグリッドがあり、更新するとPropertyChanged
上記のように更新されます。ユーザーは、マウスでドラッグしてタスクを編集することもできます。これにより、グリッドと監視可能なコレクションも更新されます。Windows 7 で実行すると、これは機能しましたが、Windows 8 では失敗します。
mainwindow.xaml のコードビハインド
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
DataContext = TStatic.TaskList;
}
private void dCanvas_PreviewMouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Tasks t = _selectedtask;
t.taskname = "Test";
PropertyChanged(t, new PropertyChangedEventArgs("Taskname"));
}
}
ファイルに保存してウォッチを追加すると、名前が変更されたため、タスク名が更新されると確信しています。
_selectedtask
グリッド行の選択からのタスクで満たされています。
Windows 8では、行
PropertyChanged(t, new PropertyChangedEventArgs("Taskname"));
null エラーを返します。Windows 7 では null ではなく、グリッドを適切に更新します。