2017-10-17 19 views
2

私は、WPFで全く新しいだと私は怒鳴る状況にこだわっている:私はObservableCollection<Person>としてのItemsSourceとデータグリッドを持ってDataGridComboBoxColumnのdatacontextを特定のクラスに変更するにはどうすればよいですか?

class Person{ 
    string Name; 
    List<Address> ListAddresses; 
} 

。このコレクションはMainViewModelクラスです。

住所を使用してDataGridComboBoxColumnを作成します。

<DataGrid ItemsSource="{Binding Persons, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn ItemsSource="{Binding Path=ListAddresses, RelativeSource={RelativeSource Mode=FindAncestor, 
     AncestorType={x:Type local:Person}}}"> 
     </DataGridComboBoxColumn>  
    </DataGrid.Columns> 
</DataGrid> 

私は次のエラーが表示されます

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='PersonApp.UL.ViewModels.Person', AncestorLevel='1''. BindingExpression:Path=ListAddresses; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=11440639); target property is 'ItemsSource' (type 'IEnumerable')

+0

MVVM構造を使用しているので、 'MainViewModel'と書いてありますか? –

+0

はい。私はMVVMを使用しています。 –

答えて

0

DataGridComboBoxColumnはあなたに多くの問題を引き起こすことが起こっています。これを試してください:あなたはまた、ComboBoxに選択されたAddress保存するために、あなたのPersonクラスでSelectedAddressプロパティを含める必要があります

<DataGridTemplateColumn Header="Something" 
          SortMemberPath="[SelectedAddress].[property from Address class]"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <ComboBox ItemsSource="{Binding ListAddresses}" 
          SelectedItem="{Binding SelectedAddress, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
          SelectedValuePath="[SelectedAddress].[property from Address class]" 
          DisplayMemberPath="[property from Address class (like Name)]" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

ItemsSourceスコープ内にあるプロパティ(この場合はDataGridにバインドするものです)にバインドすると、RelativeSourceバインディングが必要ないため、エラーが発生します。 DataGrid.ItemsSourceをたとえばPeopleListに設定し、(DataGridの内部に)ComboBox.ItemsSourceをあなたのViewModelにあるプロパティにバインドしたいが、PeopleListにはバインドしない場合は、RelativeSourceが必要です。

ComboBoxへの結合のためのもう一つは、あなたがstrings以外のオブジェクトのコレクションにItemsSourceをバインドする場合は、あなたがコントロールを右キャプションを表示させるためには、あなたのオブジェクトのプロパティにDisplayMemberPathを設定する必要があります。だから、例えば、あなたがオブジェクトCarに結合されており、それがNameと呼ばstring typeプロパティを持っている場合、あなたはまだ、単にオブジェクト全体ではなく選択になりますいずれかを選択Car.Names(あなたのコントロールディスプレイリストを作成するためにNameDisplayMemberPathを設定する必要がありますNameプロパティ)。

+0

あなたは私の一日を救った!細かく素早く答えてくれてありがとう! –

+0

私は助けることができてうれしいよ:) –

+0

また、祖先へのバインディングが必要な場合は、オブジェクトを 'ViewModel'タイプからではなく、コントロールタイプで祖先を探してみるべきです。例えば、 'UserControl'で' DataControl'を持っている 'View'を持っているなら、' {x:Type UserControl} 'の先祖を探すべきです。これはあなたの 'UserControl'の' DataContext'を提供します。あなたがMVVMを正しく実装している場合、 'UserControl'にバインドされた' ViewModel'です。 –