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>