DGVのデータを提供するBindingListとDataGridViewの間の双方向バインディングを実現しようとしています。一部の列は、基本となるリストの変更をまだ反映していないため、プロパティの変更を通知するためにプロパティ設定ツールを提供していないためだと思います。 Processプロパティの場合と同じ方法でRowsプロパティのセッターをコーディングするのではなく、もっと "エレガントな"ものを取得しようとしています...ユーティリティクラスのプロパティセッターの静的ユーティリティメソッドの使用方法
非常に興味深い書きかけに私はつまずいたよりエレガントなアプローチのために、私は(参照してください)、それの概念を実装しようとしている:ここで http://www.gavaghan.org/blog/2007/07/17/use-inotifypropertychanged-with-bindinglist/
はマイクの記事からコードである私は私のCBMIでUtilities.csとして設立(使用したいです。コモンプロジェクト):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace CBMI.Common
{
public static class Utilities
{
public static bool Set<T>(object owner, string propName,
ref T oldValue, T newValue, PropertyChangedEventHandler eventHandler)
{
// make sure the property name really exists
if (owner.GetType().GetProperty(propName) == null)
{
throw new ArgumentException("No property named '" + propName + "' on " + owner.GetType().FullName);
}
if (!Equals(oldValue, newValue)) // we only raise an event if the value has changed
{
oldValue = newValue;
if (eventHandler != null)
{
eventHandler(owner, new PropertyChangedEventArgs(propName));
}
}
return true; // Please NOTE: I had to add this statement to avoid compile error:
// "not all code paths return a value".
}
}
}
だから、私の最初の質問これについて:著者には返信の文がありませんでした。私はコンパイラのエラーを解決しました。私はイベントを推測しています.Handlerは実行して返します。これは著者の省略であり、メソッドがboolの戻り値の型を必要とするためtrueを返します。それは正しい仮定ですか?
私の第2の質問は、上記のヘルパーメソッドを使用しようとしたときに私が何であるかを示しています。私は上記のように、同じプロジェクト(および名前空間)にInputFileInfo.csと呼ばれる別のファイルにこのクラスをコード化されています:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace CBMI.Common
{
public class InputFileInfo : INotifyPropertyChanged
{
private bool processThisFile;
public bool Process
{
get { return processThisFile; }
set
{
processThisFile = value;
this.NotifyPropertyChanged("Process");
}
}
public string FileName { get; set; }
private long rowsReturned;
public long Rows
{
get { return rowsReturned; }
set
{
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
}
public string Message { get; set; }
// constructor
public InputFileInfo(string fName)
{
Process = true;
FileName = fName;
Rows = 0;
Message = String.Empty;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
私はマイクのを使用しようとするところ、このクラスで2番目のプロパティのセッターがあります静的メソッド:
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
私はUtilities.Setを削除し、次のようにそれをコーディングする場合:私は、コンパイラのcomplaを取得..then
Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
その中には"という名前の 'Set'は現在のコンテキストに存在しません"。
ユーティリティを使用してを追加しようとしました。ディレクティブしかし、それは問題を解決しませんでした。 REF T OLDVALUE、T newValueに
やSetメソッドが呼び出され値というパラメータ:
最後に、私は、パラメータを理解していません。
これらのより高度なアイデアを使用できるように、誰かがこのコードに関するこれらの複数の混乱を助けてくれますか?
---- EDIT UPDATE ---- この2つの良い答えが私を助けてくれました。上記の元の投稿の「第2の質問」はまだ分かりません。これをパッケージ化する方法に関する「ベストプラクティス」を要求するコメントを追加したので、Mikeのオリジナル記事のように単純な呼び出し構文を使用できます。つまり、私はメソッド名だけで "ヘルパー"静的メソッドを呼び出すことを模索しています。私は次のように呼び出す方法を理解したい:
set
{
Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
代わりとしてコーディングするので:
set
{
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
私はUtilities.Setをコーディングすることによって、この作業を得たが、私は質問はにビットをモーフィング推測 - "静的メソッドとそれを呼び出す方法はどこに置くのですか?クラス名でそれらを「修飾」する必要はありませんか?私は、オブジェクトのインスタンスを必要としない一般的に有用な "ユーティリティ"型のメソッドをパッケージ化する方法を理解したいと思います。この場合、静的メソッドを設定して呼び出されたが、私のような他の静的メソッドを追加できるようにしたいと思います:
public static int HelpfulMethodXXXX(string s, int num)
を私持っている唯一のクラスファイルを含む個別にコンパイルDLL(Vstudioプロジェクト)(S) 。最終的には、このクラスを他のアプリケーションで使用できると思っています。
彼らのように呼び出すことができることを、このような静的メソッドのこれらの並べ替えを宣言するのに最適な場所です。
int i = HelpfulMethodXXXX("Sample", testNumber);
の代わり:
int i = ContainingClassName.HelpfulMethodXXXX("Sample", testNumber);
+1は肩をすくめていません:) – hoodaticus