3

Object DataSource に関して質問されます。だから私はクラスを持っていると考えてください

public class Customer{

    public String name;
    public int age;

    public Customer(String name, int age) {
         this.name = name;
         this.age = age;
    }
}

そして、リスト ボックスをこれらのオブジェクトのリストにデータ バインドしました。だから私は言う

listBox.DisplayMember = "name";

しかし、私の質問は、 Customer クラスの名前を

public String fullName;

DisplayMember は「名前」のままです。これは失敗します。そのため、ドメイン オブジェクトをリファクタリングする能力が低下します。これを回避する方法はありますか?

4

7 に答える 7

5

これは、よりセクシーで柔軟なソリューションです

スニペット...

書く代わりに、長い話を短くするために:

textBoxCustomerName.DataBindings.Add("Text", bindingSource, "CustomerName");

私の提案は、次のようなものを書くことです:

dataSource.CreateBinding(textBoxCustomerName, ctl => ctl.Text, data => data.Name);

Nameこのようにすると、エンティティをリファクタリングしても (たとえば、顧客のプロパティの名前を に変更した場合)、コードは問題なく実行されますCompanyName

かなり甘いですよね?

また、いくつかの解決策はここにあります データバインディングの型を安全にし、リファクタリングをサポートする方法

于 2010-02-17T19:30:52.653 に答える
1

これについて私が見つけた唯一の方法は、オブジェクトに追加のプロパティを使用することです。

string DisplayMember
{
    get { return 'name'; }
}

オブジェクトをリファクタリングすると、返された文字列を新しいプロパティ名に変更するだけで、いくつかの場所ではなく 1 つの場所で変更できます。

それは素晴らしいことではありませんが、アプリでハードコーディングするよりもうまく機能します!

HTH

ワンショット

于 2009-06-15T14:51:56.953 に答える
1

DisplyMember を空のままにしておくと、ListBox はデフォルトの ToString() を使用します。クラスでこの関数をオーバーライドすると、リストボックスに適切な値が表示されます。次に、フィールドの名前を変更すると、ビルドは ToString() 関数で壊れます。

于 2009-06-15T15:38:31.803 に答える
0

この「問題」を「回避」するために私が見つけた唯一の実際の方法は、新しいパブリックの ReadOnly プロパティを追加することです。そのプロパティに「ListDisplay」などの名前を付けます。その後、UI に影響を与えずに実装を変更できます。

理想的な状況ではありませんが、機能します。

于 2009-06-15T14:53:06.763 に答える
0

これが、パブリック フィールドではなくプロパティを使用して、クラスからデータを公開する必要がある理由です。あまり壊れることなく、内部の作業をより簡単にリファクタリングできます。もちろん、何かを壊さなければならない場合もありますが。

于 2009-06-15T14:51:10.357 に答える
0

ReSharper はあなたのためにこれを行うことができます...入手してみてください-本当に素晴らしいソフトウェアです。おそらくCodeRushでもできるでしょう。しかし、よくわかりません。

于 2009-06-15T14:51:40.077 に答える