C# XAML - 如何将组合框添加到某些数据网格行而不是其他行?
C# XAML - How to add a combobox to some datagrid ROWS but not others?
我正在使用 key/value 可观察集合来保存在视图中由两列数据网格表示的数据。一些键值包含项目列表,而其他键值包含单个字符串值。使用下面的代码片段,我可以在组合框中显示这些键值和项目。但是,键值 'string' 行不显示任何信息,并且该行变为只读。我尽量不使用代码隐藏。我究竟做错了什么?使用隐藏代码解决问题是否简单?如果可以,最好的方法是什么?
<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 的列表。
尝试将 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>
然后使用内容控件相应地放置样式。我没试过这个,但你的数据项可以很容易地有一个 "HasMultipleValueItems" 布尔标志以便于绑定。
<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>
我正在使用 key/value 可观察集合来保存在视图中由两列数据网格表示的数据。一些键值包含项目列表,而其他键值包含单个字符串值。使用下面的代码片段,我可以在组合框中显示这些键值和项目。但是,键值 'string' 行不显示任何信息,并且该行变为只读。我尽量不使用代码隐藏。我究竟做错了什么?使用隐藏代码解决问题是否简单?如果可以,最好的方法是什么?
<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 的列表。
尝试将 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>
然后使用内容控件相应地放置样式。我没试过这个,但你的数据项可以很容易地有一个 "HasMultipleValueItems" 布尔标志以便于绑定。
<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>