2017-01-05 5 views
1

アンケートを表示するプログラムを作成しています。質問票はカテゴリ(Cat 1、Cat 2など)で分割されています。各カテゴリには多くの質問を含めることができ、各質問には複数の選択肢の回答が多数含まれています。 DataGrid(objDatagrid)とRowDetailsTemplate内にネストされた別のDataGrid(objInnerDatagrid)を使用してこのアンケートを作成しました。私はすべての質問とすべての答えがプログラムが読み込まれるときに表示されるように設定しようとしています。つまり、デフォルトでは何も折りたたまれていません。私は外部のDataGridを次のように設定してこれを実現します:RowDetailsVisibilityMode = "Visible"WPFデータをRowDetailsTemplateにバインドします。

残念ながら、私のコードのおかげで、各質問の回答はすべて現在の選択内容に基づいてすべて同じになりました。私が最初にこれを設定したとき、私はRowDetailsVisibilityMode = "Visible"を使用していませんでした。したがって、デフォルトのアクションは、選択されていないすべての質問を崩壊させることでした。しかし、私はこれが私の意図したデザインではないと述べました。

私のコードのエラーは、内部グリッド(objInnerDataGrid)ItemsSourceバインディングにあると確信しています。しかし、私はそれを何に変えるべきかを知らない。

注:私は

はあなたのすべてをありがとうフィルタIの設定を含むいくつかの無関係なコードを削除しました。

XAML:

<Grid> 
    <StackPanel> 
     <TextBox Controls:TextBoxHelper.Watermark="enter search term" Name="TxtFilter" Margin="10" TextChanged="TxtFilter_TextChanged" Height="25" MinWidth="250" HorizontalAlignment="Stretch"/> 
     <DataGrid x:Name="objDatagrid" ItemsSource="{Binding DataView}" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" Loaded="objDatagrid_Loaded" AutoGenerateColumns="False" 
       HeadersVisibility="None" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RowDetailsVisibilityMode="Visible"> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <DataGrid x:Name="objInnerDatagrid" ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.Answers}" CanUserAddRows="False" IsReadOnly="True" CanUserDeleteRows="False" 
           HeadersVisibility="None" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <DataGrid.Columns> 
          <DataGridCheckBoxColumn ElementStyle="{DynamicResource MetroDataGridCheckBox}" 
                EditingElementStyle="{DynamicResource MetroDataGridCheckBox}" 
                Binding="{Binding Answers.AnswerText}"/> 
         </DataGrid.Columns> 
        </DataGrid> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 

      <DataGrid.Columns> 
       <DataGridTextColumn Width="Auto" Binding="{Binding QuestionText}" IsReadOnly="True"/> 
      </DataGrid.Columns> 
      <DataGrid.GroupStyle> 
       <GroupStyle> 
        <GroupStyle.HeaderTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding Path=Name}" /> 
          </StackPanel> 
         </DataTemplate> 
        </GroupStyle.HeaderTemplate> 
        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="{x:Type GroupItem}"> 
             <Expander Margin="15 0 15 0" Header="{Binding Path=Name}" IsExpanded="True" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
              <ItemsPresenter VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
             </Expander> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </GroupStyle.ContainerStyle> 
       </GroupStyle> 
      </DataGrid.GroupStyle> 
     </DataGrid> 
    </StackPanel> 
</Grid> 

のC#:

public partial class DataEmbed : UserControl 
{ 
    DataTable dt = new DataTable(); 

    public DataEmbed() 
    { 
     InitializeComponent(); 

     DataContext = this; 

     _dataView = new ListCollectionView(new ObservableCollection<Question>(Populate())); 
     _dataView.GroupDescriptions.Add(new PropertyGroupDescription("CategoryString")); 

     CollectionView cv = (CollectionView)CollectionViewSource.GetDefaultView(DataView); 
     cv.Filter = CustomFilter; 
    } 
    private List<Question> Populate() 
    { 
     return new List<Question>() 
     { 
      new Question() 
      { 
       CategoryString = "Cat 1", 
       QuestionText = "Question 1", 
       Answers = new ObservableCollection<Answer> 
       { 
        new Answer {AnswerText = "Answer 1"}, 
        new Answer {AnswerText = "Answer 2"}, 
        new Answer {AnswerText = "Answer 3"}, 
        new Answer {AnswerText = "Answer 4"} 
       } 
      }, 

      new Question() 
      { 
       CategoryString = "Cat 1", 
       QuestionText = "Question 2", 
       Answers = new ObservableCollection<Answer> 
       { 
        new Answer {AnswerText = "Answer 5"}, 
        new Answer {AnswerText = "Answer 6"}, 
        new Answer {AnswerText = "Answer 7"}, 
        new Answer {AnswerText = "Answer 8"}, 
       } 
      }, 

      new Question() 
      { 
       CategoryString = "Cat 2", 
       QuestionText = "Question 1", 
       Answers = new ObservableCollection<Answer> 
       { 
        new Answer {AnswerText = "Answer 9"}, 
        new Answer {AnswerText = "Answer 10"}, 
        new Answer {AnswerText = "Answer 11"}, 
        new Answer {AnswerText = "Answer 12"}, 
       } 
      } 

     }; 
    } 

    private ListCollectionView _dataView; 
    public ListCollectionView DataView 
    { 
     get { return _dataView; } 
     set { _dataView = value; } 
    } 

    private void objDatagrid_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

クラス:

public class Question 
    { 
     public string CategoryString { get; set; } 
     public bool IsCategoryExpanded { get; set; } 
     public string QuestionText { get; set; } 
     public ObservableCollection<Answer> Answers { get; set; } 
    } 

    public class Answer 
    { 
     public string AnswerText { get; set; } 
    } 
+0

実行時にアイテムを動的に追加または削除し、特定のイベント通知を使用する必要がある場合は、ObservableCollectionを使用する必要があります。そうでなければ 'List 'を使って、グリッド/リストにバインドするときにうまく動作します。 – OmegaMan

答えて

1

結合インナーグリッドについてのあなたの仮定は、正しい明示的なを持っているためバインディ現在選択されている行に適用され、実際に現在のアイテムから外れて、すべての行に対してをバインドします。

<DataGrid x:Name="objInnerDatagrid" 
      ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.Answers}" 

したいバインディングは、すべての行に対して、その使用する場合は、明示的DataContextを指定する必要がある場合があり、このような

<DataGrid x:Name="objInnerDatagrid" 
      ItemsSource="{Binding Answers}" 

として現在のアイテムの親のDataContextに基づいて結合相対的ですこれは:

<DataGrid x:Name="objInnerDatagrid" 
      ItemsSource="{Binding DataContext.Answers}" 

最終的にバインディングはobjほとんどの場合、親から継承されるdatacontextを扱うので、これらの状況では、親とバインドについて考える。

+0

これはうまくいった。私は正しい場所を探していることを知っていました。しかし、あなたは私がその取引を封鎖するのを手伝ってくれました。どうもありがとうございます! – PatH

+0

@PatH質問に答えた場合は、回答として私の投稿をマークしてください。 – OmegaMan

+0

私はしましたが、私の担当者は私の投票だけで受け入れられるには低すぎます。それについて申し訳ありません! – PatH

関連する問題