アンケートを表示するプログラムを作成しています。質問票はカテゴリ(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; }
}
実行時にアイテムを動的に追加または削除し、特定のイベント通知を使用する必要がある場合は、ObservableCollectionを使用する必要があります。そうでなければ 'List'を使って、グリッド/リストにバインドするときにうまく動作します。 –
OmegaMan