0

私は持っていDataGridます。

内部にはいくつかの列が含まれています。2 はこの質問に関連しています。1 つはVariable 型を示すDataGridTextColumn( ) で、もう 1 つは内部の TextBox または ComboBox である可能性がある( ) です。x:Name="varTypeColumn"DataGridTemplateColumnx:Name="varValueColumn"

varTypeColumnが Bool 型の場合、 、の2 つの項目を含むvarValueColumnを表示する必要があります。Type の場合、ユーザーが文字列を入力できる TextBox を表示する必要があります。ComboBoxTrueFalsevarTypeColumnIntvarValueColumn

だから私の質問は、でそれを行うことは可能xamlですか? コードでそれを行ういくつかの実装を見つけました。それは.cs行を取得してセルを取得しようとし、最後に TextBox/ComboBox インスタンスをセルの Content プロパティに設定します。これは機能しますが、DataGrid に多数のアイテム (たとえば、5000 以上) が含まれている場合、表示が非常に遅くなります。

以下はコード部分です:

        private void InitEditors()
    {
        for (int i = 0; i < _devLinkCollectionView.Count; i++)
        {
            DataGridRow row = devLinkDataGrid.GetRow(i);
            InitEditor(row);
        }
    }

    private void InitEditor(DataGridRow row)
    {
        DevLink link = row.Item as DevLink;
        if (link != null)
        {
            if (link.HasErrors)
            {
                ToolTipService.SetShowOnDisabled(row, true);
                row.IsEnabled = false;
                return;
            }

            // Create binding first
            Binding binding = new Binding("DefaultValue")
            {
                Mode = BindingMode.TwoWay,
                UpdateSourceTrigger = UpdateSourceTrigger.LostFocus,
                Source = link
            };

            DataGridCell cell = devLinkDataGrid.GetCell(row, 4);
            switch (link.VariableType)
            {
                case CarelStandardDataType.Bool:
                    ComboBox comboBox = new ComboBox();
                    comboBox.ItemsSource = new[] {string.Empty, "TRUE", "FALSE" };

                    comboBox.SetBinding(ComboBox.SelectedValueProperty, binding);
                    cell.Content = comboBox;
                    break;

                default:
                    TextBox textBox = new TextBox();
                    textBox.Style = (Style)FindResource("TextBoxInError");
                    cell.Content = textBox;

                    binding.ValidationRules.Add(new DevLinkValidationRule(link));
                    textBox.SetBinding(TextBox.TextProperty, binding);

                    break;
            }
        }
    }
4

1 に答える 1

1

多分これはあなたが望むものです。

<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>
                            <!--In your case, you should use custom Converter, just return type, or maybe you'd better add typeProperty in your model-->
                            <DataTrigger Binding="{Binding TypeColumn}" Value="Int">
                                <Setter Value="Visible" TargetName="cbCondition1" Property="Visibility"/>
                                <Setter Value="Hidden" TargetName="tbCondition2" Property="Visibility"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding TypeColumn}" Value="Bool">
                                <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 x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
        <DataGrid Margin="160,106.5,119,139" ItemsSource="{Binding Collection}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding TypeColumn}"/>
                <DataGridTemplateColumn CellStyle="{StaticResource DataGridCellStyle1}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

==================サンプルデータ============================= =

<SampleData:SampleDataSource xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.SampleDataSource">
    <SampleData:SampleDataSource.Collection>
        <SampleData:Item TypeColumn="Int" ValueColumn="Row1"/>
        <SampleData:Item TypeColumn="Bool" ValueColumn="Row2"/>
    </SampleData:SampleDataSource.Collection>
</SampleData:SampleDataSource>
于 2013-11-13T12:39:05.997 に答える