8

まだ説明がない興味深い問題に出くわしました...

以下の非常に単純なMVVMWPFアプリケーションを考えると、ViewModelでの表示がに設定されている場合にのみ、リストがコンボボックスにバインドされるのはなぜpublicですか?

TestList可視性をに変更するinternalと、コンパイル時にエラーや警告は発生しませんが、実行時にはコンボボックスは空のままになります。

公式ドキュメントの引用:internalタイプまたはメンバーは、同じアセンブリ内のファイル内でのみアクセスできます。

この問題は、ViewとViewModelが同じアセンブリで定義されているにもかかわらず発生しています。

コードは次のようになります。

モデル:

class TestModel
{
    internal List<string> Musketeers { get; private set; }

    public TestModel()
    {
        Musketeers = new List<string> { "Athos", "Porthos", "Aramis" };
    }
}

意見:

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <ComboBox Width="250" Height="25" ItemsSource="{Binding TestList}" />
    </Grid>
</Window>

ViewModel:

class TestViewModel : INotifyPropertyChanged
{
    TestModel myModel = new TestModel();

    public List<string> TestList
    {
        get
        {
            return myModel.Musketeers;
        }
    }

    // INotifyPropertyChanged members are below ...
}
4

2 に答える 2

7

ViewModelinternalアクセス権付きはに対して表示されますが、クラスにViewは表示されないためBinding、バインディングが実際に機能します。

{Binding TestList}クラスのメンバーBindingに関する知識を持たないクラスインスタンスに変換されます。internalViewModel

于 2013-03-13T21:11:31.120 に答える
6

これは、データバインディングがリフレクションを使用し、それがアイテムの可視性に準拠しているためです。データバインディングはアセンブリの外部(WPFライブラリの内部)に実装されているため、非公開メンバーを表示することはできません。

存在しないメンバーにバインドすると、ランタイムエラーは発行されませんが、欠落しているメンバーに関する詳細を含むメッセージを含むデバッグ出力が発行されます。

于 2013-03-13T21:11:58.087 に答える