2

コレクションを動的ユーザーコントロールにバインドする必要がある部分で立ち往生しています。シナリオはこんな感じです。動的コントロールがあり、エキスパンダー、データグリッド、コンボボックス、テキストボックスがあり、comboxとテキストボックスはデータグリッド内にあります。それらにはすでに2つのコレクションがあります。1つはコンボボックスにバインドされ、もう1つはデータグリッドにバインドされます。アイテムがcomboxで変更されると、それぞれの値がそれぞれのテキストボックスに設定されます。そして、この値のペアは、datagridでバインドされたコレクションに設定されます。ユーザーは複数のアイテムを追加できます。

ここでの主な問題は、これらすべてが動的に追加されるユーザーコントロール内、つまりボタンクリックイベントで発生していることです。ユーザーは、必要な数のユーザーコントロールをフォームに追加できます。この状況で問題が発生しています。3つのコントロールを追加したとします。1つ目では、コレクションにコードを追加すると、同じコレクションにバインドされているため、次の2つのコントロールにも反映されます。したがって、上記の条件が発生しないように、同じコレクションを再生成/名前変更する方法があるかどうかを知りたいと思います。

4

1 に答える 1

3

全体像を見ずに質問に答えるのは難しいですが、あなたはこれを間違った方向に進んでいるように感じます。ユーザーコントロールのインスタンスをコードから直接追加しているようです。ItemsControlそれを行う代わりに、XAMLで何らかのものを作成し、その中でItemTemplateユーザーが制御できるようにする必要があります。それをビューモデルのコレクションにバインドしItemsControl、そのコレクションのみを操作します。

ビューモデルまたはコードビハインドのビジュアルコントロールを参照しないでください。コードから直接視覚要素を参照していることに気付いたときはいつでも、「ねえ!それよりも良い方法があります!」という警告フラグを頭に浮かび上がらせる必要があります...

例:

ビューモデル:

public class ViewModel
{
    public ObservableCollection<MyDataObject> MyDataObjects { get; set; }

    public ViewModel()
    {
        MyDataObjects = new ObservableCollection<MyDataObject>
        {
            new MyDataObject { Name="Name1", Value="Value1" },
            new MyDataObject { Name="Name2", Value="Value2" }
        };
    }
}

public class MyDataObject
{
    public string Name { get; set; }
    public string Value { get; set; }
}

リストボックスとデータテンプレートを含むウィンドウXAMLフラグメント:

<Window.Resources>
    ...
    <DataTemplate x:Key="MyDataTemplate">
        <local:MyUserControl/>
    </DataTemplate>
</Window.Resources>
...
<ListBox ItemsSource="{Binding MyDataObjects}" 
         ItemTemplate="{StaticResource MyDataTemplate}" 
         HorizontalContentAlignment="Stretch"/>

ユーザーコントロール:

<UniformGrid Rows="1">
    <TextBlock Text="{Binding Name}"/>
    <TextBlock Text="{Binding Value}" HorizontalAlignment="Right"/>
</UniformGrid>
于 2010-01-07T14:55:52.327 に答える