我使用键/值可观察集合来保存由两列数据网格在视图中表示的数据。某些键值包含项列表,其他键值包含单个字符串值。使用下面的代码片段,我可以使用组合框中的项目显示这些键值。但是,关键值'字符串'行不显示任何信息,该行变为只读。我试图不使用代码。我究竟做错了什么?使用代码解决是否简单,如果是,那么最好的方法是什么?
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding KeyValuesCollection}" HorizontalAlignment="Left" Margin="10,10,10,10">
<DataGrid.Columns>
<DataGridTextColumn Header="Field" Binding="{Binding Description}" Width="320"/>
<DataGridTemplateColumn Header="Value" Width="330">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=ValueItems}"
Visibility="{Binding ComboVisible,
Converter={StaticResource BoolToVis}}"
DisplayMemberPath="ValueName"
SelectedValuePath="ID"
SelectedValue="{Binding Id}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
以下是项目的结构:
public class KeyValue : PropertyChangedBase
{
public string Description { get; set; }
public List<ValueItem> ValueItems { get; set; }
public bool ComboVisible = false;
}
ValueItems是id,string的列表。
答案 0 :(得分:2)
尝试将DataTrigger与预定义的DataTemplate项一起使用:
<DataTemplate x:Key="OneItem" DataType="{x:Type ValueItem}" >
<TextBox Text="{TemplateBinding Id}" />
</DataTemplate>
<DataTemplate x:Key="MultiItems" DataType="{x:Type ValueItem}" >
<ComboBox ItemsSource="{TemplateBinding ValueItems}"
DisplayMemberPath="ValueName"
SelectedValuePath="ID"
SelectedValue="{TemplateBinding Id}" />
</DataTemplate>
然后使用Content控件相应地放置样式。我没有试过这个,但是你的数据项很容易就会有一个&#34; HasMultipleValueItems&#34;布尔标志,用于轻松绑定。
<DataGridTemplateColumn Header="Value" Width="330">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource OneItem}" />
<Style.Triggers>
<DataTrigger Binding="{Binding HasMultipleValueItems}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource MultiItems}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>