2016-07-16 8 views
-1

私は過去になっていないWPFデータバインディングの問題があります。私は次のようにMVVMを設定している:WPF(mvvm)データバインディングitemssourceとselecteditemを別のモデルに変更

public class ModelA 
{ 
    public int Id 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ModelB 
{ 
    public ModelA The_A 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ViewModel 
{ 
    public IEnumerable<ModelA> ModelAList 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelB> ModelBList 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

私のXAMLのDataContextのは、ViewModelに(驚き)である、と私はそれで、このリストボックスを持っている:

<ListBox ItemsSource="{Binding ModelBList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ModelAList" 
       SelectedItem="{Binding The_A}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

私は私の窓を開くと、コンボボックスをアイテムは選択されていませんが、チェックボックスから何かを選択すると、The_Aは選択したアイテムに設定されます。

私の推測では、私のModelAListのModelAはModelB'sのModelAとは異なると思います。私はこのデータ結合作業を行うことができる方法はありますか?多分私は何かが明らかでないか、問題を正しく攻撃していないかもしれません。

ありがとうございます!

+0

チェックボックスが{CheckBox IsChecked = "{バインディング、Mode = TwoWay}"にバインドされています "/> – SilentCoder

+0

ああ、私はコンボボックスの代わりにCheckBoxを使用しました。私はコンボボックスを使用することを意図していたので、selecteditemとitemssourceプロパティを使用しました。私はそれをお詫び申し上げます! モードをTwoWayに設定しても効果はありませんが、残念ながら、お勧めです! –

+0

それを聞いてよかったです。それは起こる..乾杯! – SilentCoder

答えて

-1

私はちょっとした問題を解決した後、問題の解決策を見つけました。 IDisposableの答えは、コンボボックスは2つの別々のオブジェクトに同時にバインドできないことを指摘しています。したがって、ViewModelがインスタンス化されると(ModelAのリストがロードされた後に)、リストを各ModelBにバインドするためにコピーすることができます。解決策は以下の通りです。

public class ModelA 
{ 
    public int Id 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ModelB 
{ 
    public ModelA The_A 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelA> The_A_List 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     //Load lists 
     foreach (var b in ModelBList) 
     { 
      b.The_A_List = ModelAList; 
     } 
    } 

    public IEnumerable<ModelA> ModelAList 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelB> ModelBList 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

この後、は、XAMLで以下の結合をもたらす:

<ListBox ItemsSource="{Binding ModelBList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding The_A_List}" 
       SelectedItem="{Binding The_A}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

そして、すべてが順調です。助けを求めてIDisposableに感謝し、啓発への道を私に任せてください。

3

あなたのデータバインディングは間違っているようです。それがうまくいかない理由です。 ビューはViewModelクラスにバインドされているので、驚くべきことに、そのViewModelクラスは、対応するビューからすべてのバインディングを保持することになっています。

あなたは正しくModelSourceのIEnumerableにバインドされたitemssourceを持っています。

しかし、選択した項目は他のクラスのプロパティにバインドされています。したがって、それは動作しません。また、選択したアイテムをアイテムソースにも使用されるデータタイプに設定する必要があります。次のように

は、そこでViewModelクラスのプロパティを作成します。

private ModelA _selectedComboBoxItem; 
public ModelA SelectedComboBoxItem 
{ 
    get { return _selectedComboBoxItem; } 
    set 
    { 
     _selectedComboBoxItem = value; 
     Propertychanged(this, "SelectedComboBoxItem"); 
    } 
} 

を次のようにその後のSelectedItemにバインド:

SelectedItem="{Binding SelectedComboBoxItem}" 

をこれは明らかに動作するはずです。

編集: askerが要求する詳細を追加してください。

あなたにオレンジが1個入っているとします。あなたが人からランダムに選ぶようになると、何を得るのですか?オレンジ自体は正しい?それもこの背後にある考えです。コンボボックスアイテムを選択すると、そのソースと同じタイプになります。

同じリストアイテムに多くのコンボボックスがある場合は、その多くのリストまたはプロパティを保持するようにItemsSourceデータ型を変更できます。

例:2つのコンボボックスと2つのテキストボックスを持つリストがあります。したがって、私のitemssourceはObservableCollectionであり、この観測可能なコレクションは4つのコントロールの値を保持するための2つの文字列と同様に2つの列挙型を保持します。必要に応じて、各コンボボックスの選択項目をバインドするための2つの追加プロパティを作成することもできます。

+0

ご覧のとおり、このバインディングでModelBListの各ModelBに「The_A」プロパティを設定できるようにしたいのですが、あなたのソリューションがここではそれほどカットされないことがあります(リストボックスに複数のチェックボックスがあります)。 –

+0

このように2つの異なるオブジェクトにバインドすることは、単に不可能ですか?もしそうなら、望ましい動作を得るための他の方法がありますか? S.私は上記の "コンボボックス"を意味し、チェックボックスではなく、私の悪い! –

+0

私は答えを編集し、あなたの疑問に応じてより多くの情報を追加しました。チェックしてください。 – ViVi

関連する問題