2016-11-20 2 views
3

私はこのListView有する:このListView CheckBoxはなぜ行アイテムではなく、ビューモデル全体に​​バインドされていますか?

<Window.DataContext> 
    <vm:PersonPickListViewModel /> 
</Window.DataContext> 
.... 
<ListView Grid.Row="0" Grid.Column="0" ItemsSource="{Binding PeopleOptions}" IsEnabled="{Binding ListEnabled}" SelectionMode="Multiple" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumn.HeaderTemplate> 
        <DataTemplate> 
         <CheckBox DataContext="{Binding ElementName=PersPickList, Path=DataContext}" IsChecked="{Binding AllSelected}" Command="{Binding ToggleSelectAll}" CommandParameter="{Binding ElementName=PersPickList, Path=DataContext}" /> 
        </DataTemplate> 
       </GridViewColumn.HeaderTemplate> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsSelected}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding GivenName}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

AllSelectedそのモーダルではなく、Aのプロパティであるため、ヘッダテンプレートチェックボックス用DataContextは、具体的であり、そしてIは、局所的に想定した、全体のviewmodelに設定され、PersonPickListViewModelをアイテムオブジェクト、すなわちPeopleOptionsのメンバー、すなわちPickListPersonを含む。

セルテンプレートの中にはPickListPerson.IsSelectedがバインドされているため、ヘッダーではなく行のデータコンテキストを想定していると思います。 Bindingの後に "Path"と入力すると、PickListPersonのプロパティではなく、すべてPersonPickListViewModelのプロパティのリストが表示されます。

私は間違っていますが、どうすれば修正できますか?

+0

@lukbl類似点は見当たりません。まず、彼はある要素を別の要素にバインドしようとしていますが、それは私の意図に近くありません。私の問題は、行チェックボックスを各行の 'IsSelected'プロパティにバインドすることです。チェックすると正しい行に' IsSelected'が 'true 'に設定されます。私は "この行のアイテム"にバインドすることを可能にするバインディング式を見つけることができません。これで、ビューモデル全体のプロパティのいずれかにバインドできますが、行アイテムのプロパティをデータバインドすることはできません。 – ProfK

+0

あなたはそれについて正しいです、私はあなたの質問を誤解しました。このようにBindingを指定することによってエラーが出るのですか、それともintellisenseの問題だけですか? PeopleOptionsのタイプは何ですか?似たようなxamlの私の場合は、期待どおりに動作します。 – lukbl

+0

'PeopleOptions'は' ObservablleCollection 'です。' IsSelected'は 'SelectablePerson'のプロパティです。 出力ウィンドウにエラーは表示されませんが、ReSharperはバインディングで 'IsSlected'を赤く鳴らし、別のプロパティを試してみると、私の全体の' DataContext'のプロパティリストを取得します。 PersonPickListViewModel' – ProfK

答えて

0

ListViewにx:Name="PersPickList"を設定することを忘れませんでしたか?私はコントロールの中で名前で見つけることができません。 DataContext="{Binding ElementName=PersPickList, Path=DataContext}"を設定すると、チェックボックスの他のすべてのバインディングは、指定されたPersPickListコントロールのdatacontextでそのソースを見つけるように指定します。それがVisualTreeの要素を見つけられない場合、問題を引き起こす可能性があります。

理想的には、GridViewヘッダーは親コントロールからdatacontextを継承しますが、セルは行からdatacontextを継承します。私は、あなたのコードをListViewにx:Nameを設定し、INotifyPropertyChangedインターフェースを介してビューに通知するIsSelected、AllSelectedプロパティを許可するように管理しました。 INotifyPropertyChangedを使って変更を加えても、それを破ることはできません。しかしそうでなければ、それはうまくいくはずです。

2

私はあなたが実際で、それはときに問題のCheckBoxは、行項目にバインドされていないという誤った前提に動作しているので、あなたの質問には無効であると信じています。 XAMLデザイナーは、バインディングを定義するときにitem view-modelではなくメインview-modelのメンバーを提案していると誤解していると思います。デザイナーは完璧なツールではなく、実行時にデータコンテキストがどのようになるかを推測しようとしますが、あなたの場合のように間違ってしまうことがよくあります。

私は間違っていない場合、それはデータコンテキストは、それがXAML構造に由来として継承されます前提としています

CheckBox ← GridViewColumn ← GridView ← ListView ← ... ← Window 

しかし、実行時に、GridViewColumn.CellTemplateデータテンプレートがContentPresenter.ContentTemplateとして使用され、 ContentPresenter.Contentは行項目です。そのContentPresenterは、GridViewRowPresenterの子であり、セルを表します。したがって、実行時にテンプレート化されたデータは実際にはアイテムビューモデルです。

0

再度この

<DataTemplate> 
    <CheckBox IsChecked="{Binding PersPickList.AllSelected}" Command="{Binding PersPickList.ToggleSelectAll}" CommandParameter="{Binding PersPickList}" /> 
</DataTemplate> 

のように実行しようとも間違ってやっているものを判断するはるかに容易になるので、あなたは、すべてあなたのビューモデルのコードをポストする必要があります。

+0

私はすべてを選択したいだけではなく、実際には問題がヘッダーにあったとは言いませんでしたモデルコードが違いを生むとは思わない。質問はXAMLコードについて100%ですが、私はセルテンプレート内にバインドされている "' 'PickListPerson.IsSelected'について質問しました。"あなたが記述するバインディング、sansコマンドは、私のヘッダテンプレートにあり、うまく動作します。あなたは**理解しやすいように**注意深く**を読んでください。 – ProfK

関連する問題