C#XAML - 如何将组合框添加到某些数据网格ROWS而不是其他数据网格?

时间:2015-06-15 09:06:08

标签: c# wpf xaml datagrid combobox

我使用键/值可观察集合来保存由两列数据网格在视图中表示的数据。某些键值包含项列表,其他键值包含单个字符串值。使用下面的代码片段,我可以使用组合框中的项目显示这些键值。但是,关键值'字符串'行不显示任何信息,该行变为只读。我试图不使用代码。我究竟做错了什么?使用代码解决是否简单,如果是,那么最好的方法是什么?

    <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的列表。

1 个答案:

答案 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>