C#のデータバインディング-文字列としてのプロパティ名

c# data-binding user-controls winforms
C#のデータバインディング-文字列としてのプロパティ名

thisを読んだ後、クラスのプロパティをUserControlのTextBoxにバインドする方法を確信しています。 それでも、文字列を介してプロパティにアクセスするのは非常に不快です。 型への接続またはそのプロパティの存在さえも(両側で)失われます。 +この態度に関する私の主な問題は次のとおりです。

  • IntelliSenseは動作を停止します→間違いを犯しやすく、利便性が低下します。

  • そこに書かれているものは、呼び出されるまでチェックされません→
    間違いは可能な限り最悪の瞬間まで見過ごされる可能性があります…​

そのクラスのインスタンスに接続され、それと同期されたままである1つのクラスを表すUserControlを作成する他の方法はありますか? (イベントで手動で行うことに加えて)

  3  1


ベストアンサー

_
(イベントで手動で行うことに加えて)
_

一方向および双方向のデータバインディングがイベントに依存することを明確にする必要があります。 http://msdn.microsoft.com/en-us/library/ms743695.aspx [方法:プロパティ変更通知を実装する]についてお読みください

ただし、コード内でプロパティ名を表す文字列をハードコーディングせずにデータバインドできます。

それを行う1つの方法は、カスタム属性を使用することです。 ユーザーコントロールをバインドするデータモデルの特定のプロパティを装飾できます。 このように、 DataSource`がユーザーコントロールに設定されている場合、リフレクションを介して DataSource`オブジェクトでカスタムの `Attribute`装飾プロパティを検索し、それらにバインドできます。

public class MyDataModelObject
{
    public int NotBindableProperty { get; }

    [MyBindableAttribute]
    public string BindableStringProperty
    {
        get {...}
        set {...}
    }
}

0


文字列の使用を強制される理由はありません。これは、基本的な `NotifyPropertyChanged`イベントメカニズムです。 たとえば、http://www.davidhayden.com/blog/dave/archive/2008/03/12/PrismWPFGuidanceReferenceImplementationMicrosoftPatternsPractices.aspx [Prism Framework]は、Linqの「式」を引数として使用する単純なラッパーを提供します。プロパティ名を取得するためのリフレクション(ただし、短期間で何度も更新されたプロパティで使用するとパフォーマンスの問題が発生するのを見たことがあります)

次のようにPrismフレームワーク全体を使用する必要なく、このようなラッパーを自分で簡単に作成できます。

class NotificationObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    protected virtual void OnPropertyChanged( ProeprtyChangedEventArgs e )
    {
        PropertyChanged( this, e );
    }

    protected void RaisePropertyChanged(Expression> propertyExpression )
    {
        // you'll want to add some error checking here
        var name = ((MemberExpression)propertyExpression).Member.Name;
        OnPropertyChanged( new PropertyChangedEventArgs( name ) );
    }
}

プロパティを渡すだけで使用できます:

class Whatever : NotificationObject
{
    private string _foo = String.Empty;
    public string Foo
    {
        get { return _foo ?? String.Empty; }
        set
        {
            if( !_foo.Equals( value ) )
            {
                _foo = value;
                RaisePropertyChanged( this.Foo );
            }
        }
    }
}

これで、プロパティ `Foo`をリファクタリングしても、文字列の更新について心配する必要はありません。 ただし、これは反対側の問題を解決しません。 DependencyPropertyには内部的に文字列の問題がありますが、外部では_n_個の重複ではなく、1つの場所(クラス内)での重複のみであるため、IMPが望ましいです。 完全ではありませんが、役立ちます。

0


このプロジェクトhttp://github.com/SimonCropp/NotifyPropertyWeaver[notifypropertyweaver]を確認することもできます。これは、マジックストリングを回避し、さらにクールな機能を提供します。

0


タイトルとURLをコピーしました