2012-02-29 6 views
0

DataGridのウィジェットがObservableCollection < "Product">にバインドされています。列は、Productのプロパティにバインドされています。そのうち大部分はdouble型ですか(ヌル可能)。プロパティ値をnullに設定した後にバインドが機能しない

いくつかのプロパティをnullに設定する必要があります。その後、私が設定した値に関係なく、バインディングは機能しません。ビュー内の値は更新されません。

プロパティをnullに設定するとバインドはどうなりますか?

私はこのブログ記事http://wildermuth.com/2009/11/18/Data_Binding_Changes_in_Silverlight_4に表示されているものを試しましたが、それは私には役に立たなかった。

ありがとうございます!

編集: 以下はINotifyPropertyChangedの

public class NotifyPropertyChangedAttribute : INotifyPropertyChanged 
{ 
    Dictionary<string, object> _propBag = new Dictionary<string, object>(); 
    protected object Get(string propName) 
    { 
     object value = null; 
     _propBag.TryGetValue(propName, out value); 
     return value; 
    } 

    protected void Set(string propName, object value) 
    { 
     if (!_propBag.ContainsKey(propName) || Get(propName)!=null) 
     { 
      _propBag[propName] = value; 
      OnPropertyChanged(new PropertyChangedEventArgs(propName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     PropertyChanged(this, e); 
    } 
}  

これは私のProductクラスを実装し、私が作成したクラスです。 DataGridのItemsSourceプロパティは、ProductsのObservableCollectionにバインドされています。

public class Product : NotifyPropertyChangedAttribute 
{ 

    public string Name 
    { 
     get { return (string)Get("Name") ?? ""; } 
     set { Set("Name", value); } 
    } 

    public double? Price 
    { 
     get {return (double)Get("Price") ?? null;} 
     set { Set("Price", value);} 
    } 

    public void Reset() 
    { 
     var propertyInfo = typeof(Product).GetProperties(BindingFlags.DeclaredOnly  | BindingFlags.Public | BindingFlags.Instance); 
     foreach (var p in propertyInfo) 
     { 
      p.SetValue(this , null, null); 
     } 
    } 
} 

Reset()メソッドを参照してください。このメソッドを呼び出した後、バインディングが停止します。 私のアプリでは、ユーザーが「Del」キーを押すと、DataGridの行は空になりますが、削除することはできません。

+1

xamlとviewmodelのプロパティの1つを投稿してください。 – gaurawerma

答えて

1

コレクションの参照をnullに設定すると、ソースがもう存在しないため、コントロールとソースの間でバインディングが壊れます。この場合、コントロール内のアイテムソースを明示的に再バインドする必要があります。

コレクションにnullを割り当てるのではなく、コレクションをクリアすることをお勧めします。

更新:コレクション内のアイテムのプロパティについては、アイテムタイプがINotifyPropertyChangedを実装していることを確認してください。 DataGridの行は、アイテムクラス自体のこのインタフェースを介した変更をリッスンします。

+0

私はコレクションにnullを設定していません。コレクションのアイテムのいくつかのプロパティにnullを設定します。まだ同じ?もう一度バインドしなければならないのですか?ありがとう! –

+1

申し訳ありませんが、私はあなたの質問を誤解しました。いいえ、バインドをリセットする必要はありません。あなたのコレクションのアイテムはINotifyPropertyChangedを実装していますか?あなたのコレクションがそれを実装していても、アイテムタイプ自体は変更されていないので、DataGridに通知されることがあります。 –

+0

私はINotifyPropertyChangedを実装するクラスを作成しました。私のProductクラスはそれを継承しています。いくつかのコードを表示するように質問を更新しました。 –

関連する問題