2011-07-19 12 views
0

私は、WPFを使用してMVVMパターンに従っていくつかのタブ項目を生成するTabControlを持っています。 TabControl ItemTemplateつまり、生成されたタブアイテムごとに、別のリストのデータを表示するコンボボックスがあります。 このリストは、タブ項目自体のバインドされたオブジェクトとは異なります。wpfでアイテムをデータグリッドとして持つコンボボックスをバインドするにはどうすればいいですか? ComboBox自体はDatatemplateの一部です

例:タブアイテムがアドレスオブジェクトにバインドされている場合、コンボボックスは状態リストのデータを表示し、アドレスオブジェクトに存在する状態を選択したアイテムとして表示する必要があります。

コンボボックスは、状態リスト

問題は、すべてのデータがすべてのセクションに示されているが、コンボボックスは、単にデータを表示wouldntのことであるにバインドされているデータグリッドのような項目を1つだけ有しています。驚くべきことに、TabControl DataTemplateから取り出したときのComboboxは正常に機能します。

以下は、tabcontrolの外側と内側の両方のコードです。いくつかの提案をしてください!

は------この1つはTabControlの外にあり、完璧に動作--------------

<ComboBox SelectedValue="{Binding SelectedState}" HorizontalAlignment="Left" VerticalAlignment="Center" IsEditable="True" Margin="50,55,0,61" Height="27" Width="193"> 
        <ComboBoxItem TextSearch.Text="{Binding SelectedState}"> 
         <ContentControl> 
          <DataGrid SelectedIndex="{Binding StateSelectedIndex}" ItemsSource="{Binding StateData}" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" cal:Message.Attach="[Event SelectionChanged] = [Action SelectionChanged]"> 
           <DataGrid.Columns> 
            <DataGridTextColumn Header="StateName" Binding="{Binding StateName}" /> 
           </DataGrid.Columns> 
          </DataGrid> 
         </ContentControl> 
        </ComboBoxItem> 
       </ComboBox> 

----この1は、TabControlの内側にあります---------

<TabControl Margin="3,3,0,0" HorizontalAlignment="Left" Width="752" Height="255" VerticalAlignment="Top" Grid.ColumnSpan="2" Grid.Row="1" ItemsSource="{Binding Addresses}" SelectedIndex="{Binding WhichAddressTab}" > 
      <TabControl.ItemContainerStyle> 
        ................................... 
      </TabControl.ItemContainerStyle> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <ContentControl> 
           .......................... 
           <ComboBox SelectedValue="{Binding SelectedState}" HorizontalAlignment="Left" VerticalAlignment="Center" IsEditable="True" Margin="108,3,0,1" Grid.ColumnSpan="3" Grid.Row="1" Width="147"> 
            <ComboBoxItem TextSearch.Text="{Binding SelectedState}" > 
             <ContentControl>             
              <DataGrid SelectedIndex="{Binding StateSelectedIndex}" ItemsSource="{DynamicResource StateData}" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" cal:Message.Attach="[Event SelectionChanged] = [Action SelectionChanged]"> 
               <DataGrid.Columns> 
                <DataGridTextColumn Header="StateName" Binding="{Binding StateName}" /> 
               </DataGrid.Columns> 
              </DataGrid> 
             </ContentControl> 
            </ComboBoxItem> 
           </ComboBox> 
          ........................... 
         </Grid> 
        </ContentControl> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 

Iは、検索しようとしていると問題がDataTemplateを内部データバインディングであると理解しているが、所望の結果を達成することができませんでした。

答えて

0

はい、問題はバインディングにあります。 DataTemplate内のDataContextは、(ItemsSourceにバインドされたコレクションの)単一の要素用です。つまり、ViewModel自体に直接存在するプロパティにはアクセスできません。

この問題を回避するには、たとえばTabControlに名前を付け、DataTemplate内のバインディングをElementNameバインディングを使用するように変換します。 ViewModelを静的リソースとして定義した場合の別の解決策は、リソースに直接バインドし、パスを使用してバインドするプロパティを指定することです。

希望します。

関連する問題