15

私はMVVMを使っていくつかの異なることを試みています。View にバインドされている ViewModel プロパティは public です。ボタンバインディングの例をとっています。ここに簡単なサンプルがあります。

View.xaml:

<Button Content="Test Button" Command="{Binding TestButtonCommand}" />

ViewModel.cs

private ICommand _testButtonCommand;
public ICommand TestButtonCommand
{
    get { return _testButtonCommand?? (_testButtonCommand= new RelayCommand(SomeMethod)); }
}

TestButtonCommandここで私の質問は、公開ではなく内部にできるかということです。内部は現在のプロジェクトにアクセスできることを意味するので、それを行うのに問題はありませんか? しかし、私がそれをやろうとしたとき、それはうまくいきませんでした。getter にブレークポイントを追加してもヒットしませんでした。では、なぜ内部化できないのでしょうか。

msdn からのリンクです。

http://msdn.microsoft.com/en-us/library/ms743643.aspx

バインディングのバインディング ソース プロパティとして使用するプロパティは、クラスのパブリック プロパティである必要があります。明示的に定義されたインターフェイス プロパティには、バインディングの目的でアクセスすることはできません。また、基本実装を持たない保護されたプライベート プロパティ、内部プロパティ、または仮想プロパティにもアクセスできません。

なぜこれができないのでしょうか?

アクセス internal の場合、同じプロジェクトで作業している場合は public と同じです。では、なぜここで internal を使用できないのでしょうか? これらが公開されるべき理由があるはずであり、私はその理由を探しています。

internal ICommand TestButtonCommand { ...... }
4

7 に答える 7

2

可視性は、internalメンバー アクセスの完全なコンテキストを知っているため、実際にはコンパイラと IL 検証者にとってのみ意味があります。WPF バインディング エンジンにはありません。プロパティにバインディングが存在することを認識しています。誰がプロパティを設定したかはわかりません。XAML で設定することも、実行時に動的に設定することもできます (技術的には、XAML で設定しても動的に適用されます)。

アクセス ルールを適用する方法がないため、プロパティへのバインドを許可することは、プロパティではなくプロパティへのinternalバインドを許可することと同じです。privatepublic

于 2013-10-31T11:13:57.863 に答える
2

明らかに、それはあなたがこの状況から何を達成しようとしているのかに依存します - あなたは全体的な目的が何であるかを述べていません. 私のコードで同様の問題に遭遇したばかりで、私の場合の解決策にも遭遇しました。ライブラリの 1 つにさまざまなプロパティを持つヘルパー オブジェクトが含まれていますが、これらがアプリケーション プロジェクトで使用されている場合、自分に役立つプロパティのみを表示したいと考えています。たとえば、Command プロパティを非表示にしたいと考えていました。

ライブラリの「ユーザー」からそれらを隠すための私の解決策は、追加することです

<EditorBrowsable(EditorBrowsableState.Never)>

私にとってほとんどまたはまったく関心がない各プロパティに属します。

それが誰かを助けることを願っています!

于 2016-09-20T15:43:13.313 に答える
0

作成された内部プロパティは、優れた OO 設計を壊し、カプセル化を壊しています。ケースに内部 set アクセサー (および public get アクセサー) を使用できます。

public ICommand SaveCommand
{
    get;
    internal set;
}

プロパティにカプセル化されたフィールドがある場合は、クラス内であっても常にプロパティを介してそのフィールドにアクセスすることをルールにする必要があります。ベストプラクティスです。

于 2013-10-31T11:00:09.560 に答える