2

WPF、MVVM を使用します。UserControl である ModifyZooControl というコントロールがあります。複数のウィンドウに追加したいので、これはコントロールです。

ウィンドウの 1 つは、MVVMLight から DataContext を取得する ModifyZooWindow です。ウィンドウの xaml にユーザー コントロールを追加します。

<uc:ModifyZooControl/>

ObservableCollection<Animal> AnimalsZoo インスタンスのプロパティを一覧表示するために、ModifyZooControl には次のようなものがあり ます。

    <ListBox Name="Animals" ItemsSource="{Binding Animals}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

これはこれまでのところ機能しており、ウィンドウがあり、その中に動物をリストする ModifyZooControl があります。

次に、コントロールの分離コードから動物のリストを変更します。それ、どうやったら出来るの?

Animals.Items.Add(newAnimal)「ItemsSource が使用されている間は操作が無効です。代わりに ItemsControl.ItemsSource を使用して要素にアクセスし、変更してください」という理由で機能しません。

UserControl のコード ビハインドから元の viewmodel Animals observablecollection に到達するにはどうすればよいですか?

私が理解しているように、1 つの選択肢は、ObservableCollections の 2 つのプロパティを UserControl に追加することです。Window から UserControl をインスタンス化するときに値を設定します。次に、元の ObservableCollections への参照があり、それらを変更できます。しかし、ウィンドウのデータコンテキストを介してコレクションへの何らかの参照が既に存在することを考えると、それは本当に必要ですか?

また、UserControl はこの種の正しい選択ですか? むしろフレームを使用する必要がありますか、それとも何か他のものを使用する必要がありますか?

4

1 に答える 1

3

UserControl のコード ビハインドから元の viewmodel Animals observablecollection に到達するにはどうすればよいですか?

通常、これは行いません。一般に、これを必要とする「コマンド」をコマンドとしてバインドする方が良い方法であり、ロジックを ViewModel に残すことができます。AnimalViewModel は、新しいインスタンスを独自のコレクションに追加するものである必要があります。

何らかの理由でこれを行う必要がある場合は、データ コンテキストをキャストできます。

// In code behind:
Zoo vm = this.DataContext as Zoo;
if (vm != null)
{
    ObservableCollection<Animal> items = vm.Animals;
    items.Add(newAnimal);
}
于 2013-10-07T16:49:01.610 に答える