Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid中一列中的动态单元格控件_C#_Wpf_Mvvm_Datagridview_Wpfdatagrid - Fatal编程技术网

C# WPF DataGrid中一列中的动态单元格控件

C# WPF DataGrid中一列中的动态单元格控件,c#,wpf,mvvm,datagridview,wpfdatagrid,C#,Wpf,Mvvm,Datagridview,Wpfdatagrid,我想在一列中基于另一列中的值创建带有动态单元格控件的WPF DataGrid,如下图所示 XAML <Window.Resources> <Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}"> <Setter Property="Background" Value="Transparent"/> <Setter Property=

我想在一列中基于另一列中的值创建带有动态单元格控件的WPF DataGrid,如下图所示

XAML

<Window.Resources>
    <Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Height="21.96">
                        <ComboBox x:Name="cbCondition1">
                            <ComboBoxItem Content="1"/>
                            <ComboBoxItem Content="2"/>
                        </ComboBox>

                        <TextBox x:Name="tbCondition2" Text="text"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding TypeColumn}" Value="ComboBox">
                            <Setter Value="Visible" TargetName="cbCondition1" Property="Visibility"/>
                            <Setter Value="Hidden" TargetName="tbCondition2" Property="Visibility"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding TypeColumn}" Value="TextBox">
                            <Setter Value="Hidden" TargetName="cbCondition1" Property="Visibility"/>
                            <Setter Value="Visible" TargetName="tbCondition2" Property="Visibility"/>
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
            </Trigger>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
 <DataGrid HorizontalAlignment="Left" Width="500" Grid.ColumnSpan="2" VerticalAlignment="Top" x:Name="GridWorkers" 
                  ItemsSource="{Binding Workers}" Grid.Row="1" SelectedItem="{Binding SelectedWorker}" AutoGenerateColumns="False">
   <DataGrid.Columns>
        <DataGridTextColumn Header="Control Type" Binding="{Binding TypeColumn}" Width="90" IsReadOnly="True"/>
        <DataGridTemplateColumn Header="Dynamic Control" CellStyle="{StaticResource DataGridCellStyle1}"/>
   </DataGrid.Columns>
 </DataGrid>
</Grid>


我可以用xaml风格来实现这一点,但是寻找在DataGrid单元中动态添加控件的编程方式(即从C#代码中同时添加控件)(mvvm方法和代码隐藏方法)是首选。其他可能的解决方法也值得赞赏。

您可以使用带有
样式的
ContentControl
,该样式基于
ControlType
源属性的值设置
Content
属性,例如:

<DataGrid ... AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Control Type" Binding="{Binding ControlType}" />
        <DataGridTemplateColumn Header="Dynamic Control">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentControl>
                        <ContentControl.Style>
                            <Style TargetType="ContentControl">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ControlType}" Value="ComboBox">
                                        <Setter Property="Content">
                                            <Setter.Value>
                                                <ComboBox />
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ControlType}" Value="TextBox">
                                        <Setter Property="Content">
                                            <Setter.Value>
                                                <TextBox Text="text...." />
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

这个问题不完整,如何创建一个最小、完整且可验证的示例: