【解決方法】datagridcomboboxcolumn で、各個別のコンボボックスのチェックされた値を取得するにはどうすればよいですか?


ObservableCollection からデータをロードする DataGrid があり、各行には CheckBox があるため、チェックされた行のリストを取得できます。 ここで、ComboBox である DataGrid に新しい列を追加したいと考えました。ComboBox には Checkboxen のリストがあります。 行ごとに、1 つの行をチェックしてから ComboBox の他の項目をチェックするときに、選択した行と ComboBox から選択した値を組み合わせることができるようにしたいと考えています。

問題は、Combobox 項目の 1 行をチェックすると、DataGrid に表示される他のすべての ComboBox がチェックされることです。

1行のコンボボックスの値をチェックし、それをデータグリッドのチェックされた行の値と組み合わせたいだけです。

私のDataGridのコードは次のとおりです。

<DataGrid  Style="{DynamicResource DataGridStyle}" 
                       Margin="10"  SelectionUnit="CellOrRowHeader"  AutoGenerateColumns="False" 
                       CanUserAddRows="False" CanUserDeleteRows="False" SelectionMode="Single"  VerticalAlignment="Stretch"
                       x:Name="SpaltenGrid" ItemsSource="{Binding bischenanders, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                       GridLinesVisibility="None"  ScrollViewer.CanContentScroll="True" 
                       ScrollViewer.VerticalScrollBarVisibility="Auto" 
                       ScrollViewer.HorizontalScrollBarVisibility="Auto">
                        <DataGrid.Columns >
                            <DataGridCheckBoxColumn x:Name="selectedField" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Auswahl" CanUserSort="False">
                                <DataGridCheckBoxColumn.ElementStyle>
                                    <Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}" />
                                </DataGridCheckBoxColumn.ElementStyle>
                            </DataGridCheckBoxColumn>
                            
                            <DataGridTextColumn  Header="Spaltenname"  Binding="{Binding Spaltenname}" Width="1.5*"/>
                            
                            <DataGridComboBoxColumn x:Name="cmbAdditionColume"   Header="AdditionsSpalten" DisplayMemberPath="Spaltenname"
                                                    CanUserSort="False" Width="*">
                            
                                <DataGridComboBoxColumn.ElementStyle>
                                    
                                    <Style TargetType="ComboBox"  BasedOn="{StaticResource ComboBoxStyle1 }"  />
                                </DataGridComboBoxColumn.ElementStyle>

                            </DataGridComboBoxColumn>

                            <!--<DataGridTemplateColumn Header="Week Days" Width="*" x:Name="cmbTemplateColumn">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox x:Name="cmbAdditionColume" Foreground="Black"
                                                  DisplayMemberPath="Spaltenname" Style="{StaticResource ComboBoxStyle1}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>-->

                        </DataGrid.Columns>

                        <DataGrid.Resources>
                            <!-- Select everything with orange... -->
                            <SolidColorBrush 
    Color="Transparent" 
    x:Key="{x:Static SystemColors.HighlightBrushKey}" />
                            <!-- ...all the time -->
                            <SolidColorBrush 
    Color="Transparent" 
    x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" />
                            <!--Design kopfzeile-->
                            <Style TargetType="{x:Type DataGridColumnHeader}" x:Name="test2" >
                                <Setter Property="Background" Value="Red"/>
                                <Setter Property="Foreground" Value="Black"/>
                                <Setter Property="FontWeight" Value="SemiBold"/>
                                <Setter Property="Height" Value="30"/>
                                <Setter Property="FontSize" Value="15"/>
                                <Setter Property="BorderThickness" Value="0" />
                                <Setter Property="BorderBrush" Value="Green"/>
                                <Setter Property="Padding" Value="10 0 0 0"/>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                                            <Grid x:Name="insideHeader" Background="Transparent">
                                                <Border x:Name="borderHeader" BorderThickness="0"
                                        CornerRadius="10" 
                                        Background="White"
                                        Padding="10,0,0,0"
                                        >
                                                    <ContentPresenter />
                                                </Border>
                                                <!--<Thumb HorizontalAlignment="Right"
                           Grid.Column="1"
                           Name="PART_HeaderGripper"
                           Margin="0,4,0,4"
                           Width="2"/>-->
                                            </Grid>

                                            <ControlTemplate.Triggers>
                                                <Trigger Property="IsMouseOver" Value="True">
                                                    <Setter  Property="Foreground" Value="{DynamicResource PrimaryBlueColor}"/>
                                                </Trigger>
                                                <Trigger Property="IsPressed" Value="True">
                                                    <Setter TargetName="borderHeader" Property="Background" Value="{DynamicResource SecundaryGrayColor}"/>
                                                </Trigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>

                            <Style TargetType="{x:Type DataGridRowHeader}">
                                <Setter Property="Content" Value=">" />
                                <Setter Property="Foreground" Value="{DynamicResource PrimaryBlueColor}" />
                                <Setter Property="FontWeight" Value="Bold"/>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                                            <Grid x:Name="insideHeader" Background="Transparent">
                                                <Border x:Name="borderHeader" BorderThickness="0"
                                        CornerRadius="2"
                                        Background="White"
                                        Padding="0,10,0,0"
                                        >
                                                    <TextBlock Text=">" FontSize="12" VerticalAlignment="Top" Margin="0 0 0 0" TextAlignment="Center" FontWeight="Bold" Width="20" Foreground="{DynamicResource PrimaryBlueColor}" />

                                                </Border>
                                            </Grid>

                                            <ControlTemplate.Triggers>
                                                <Trigger Property="IsMouseOver" Value="True" >
                                                    <Setter TargetName="borderHeader" Property="Background" Value="{DynamicResource PrimaryGrayColor}"/>
                                                </Trigger>
                                                <Trigger Property="IsPressed" Value="True">
                                                    <Setter TargetName="borderHeader" Property="Background" Value="{DynamicResource SecundaryGrayColor}"/>
                                                </Trigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>

                            </Style>

                            <!--Deaktivieren Des rowheader
                    <Style TargetType="{x:Type DataGridRowHeader}">
                        <Setter Property="Background" Value="Transparent"/>
                    </Style>-->

                            <!--Cellen Design-->
                            <Style TargetType="{x:Type DataGridCell}">
                                <Setter Property="Background" Value="Transparent"/>
                                <Setter Property="Foreground" Value="Black"/>
                                <Setter Property="FontFamily" Value="sans-serif"/>
                                <Setter Property="BorderThickness" Value="0" />
                                <Setter Property="BorderBrush" Value="#333333"/>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                                            <Border x:Name="insideBorder" Background="Transparent" BorderThickness="0 2 0 1" BorderBrush="#dddddd">
                                                <Border x:Name="BorderCell" BorderThickness="0"
                                        CornerRadius="6"
                                        Background="White"
                                        Padding="8,5,0,5"
                                        Margin="2">
                                                    <ContentPresenter/>
                                                </Border>
                                            </Border>
                                            <ControlTemplate.Triggers>
                                                <Trigger Property="IsMouseOver" Value="True">
                                                    <Setter  Property="Foreground" Value="{DynamicResource PrimaryBlueColor}"/>
                                                </Trigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGrid.Resources>



                    </DataGrid>

私の ComboBox のアイテム テンプレート:

<Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=cmbIsChecked, Mode=TwoWay}" Width="20"/>
                        <TextBlock Text="{Binding Path=Spaltenname}" VerticalAlignment="Center" />
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>

私の「bischenanders」コレクション(その悪い名前は残念ですが、将来修正します)

私のoutputColumnsクラス:

public class OutputColumns
{
    public string Spaltenname{ get; set; }
    public bool IsChecked { get; set; }

    public bool cmbIsChecked { get; set; }


}

それが、行とコンボボックス行の選択された項目を読み取る方法です

public List<OutputColumns> GetSelectedItems()
    {
        var selectedItems = new List<OutputColumns>();

        foreach (OutputColumns item in View.bischenanders)
        {
            try
            {
                if (item.IsChecked)
                {
                    selectedItems.Add(item);
                }
            }
            catch
            {

            }
        }
        return selectedItems;
    }

    public List<OutputColumns> cmbGetSelectedItems()
    {

        var selectedItems = new List<OutputColumns>();

        foreach (OutputColumns item in View.bischenanders)
        {
            try
            {
                if (item.cmbIsChecked)
                {
                    selectedItems.Add(item);
                }
            }
            catch
            {

            }
        }
        return selectedItems;
    }

したがって、この行がチェックされている場合:

写真1

そしてコンボボックスで2行がチェックされています:

写真2

次に、これらの3つの値が結合されるようにしたい

しかし、1 つの ComboBox をチェックインすると、DataGrid 内のすべてのコンボボックスに同じチェック済みの値が含まれます

新しい ComboBox を開くたびに、彼はクラスからデータを取得し、そこにプログラムがチェックされているバージョンを見つけるように見えます.ComboBoxはすでに開いているため、独自のチェックされた値を取得し、新しいものだけが前のチェックボックスでチェックされているものをチェックします。

手伝ってくれてありがとう!

私が試したこと:

新しいコレクションを作成して、次のように追加しようとしました:

<DataGridTemplateColumn Header="AdditionsSpalten"  Width="*" x:Name="cmbTemplateColumn">
                                   <DataGridTemplateColumn.CellTemplate>
                                       <DataTemplate>
                                           <ComboBox ItemsSource="{Binding ocColumns}" SelectedItem="{Binding cmbIsChecked}" DisplayMemberPath="Spaltenname" Style="{StaticResource ComboBoxStyle1}">
                                               <ComboBox.ItemTemplate>
                                                   <DataTemplate>
                                                       <StackPanel Orientation="Horizontal">
                                                           <CheckBox IsChecked="{Binding cmbIsChecked}" Width="20" />
                                                           <TextBlock Text="{Binding Spaltenname}" Width="100" />
                                                       </StackPanel>
                                                   </DataTemplate>
                                               </ComboBox.ItemTemplate>
                                           </ComboBox>
                                       </DataTemplate>
                                   </DataGridTemplateColumn.CellTemplate>
                               </DataGridTemplateColumn>

そして私のOutputColumnsクラスで:

private ObservableCollection<OutputColumns> _outputs;
        public ObservableCollection<OutputColumns> outputs
        {
            get
            {
                return _outputs;
            }

            set
            {
                _outputs = value;
                NotifyPropertyChanged(nameof(outputs));

            }
        }

ここにデータを入力します。

foreach(OutputColumns columns in View.bischenanders)
            {
                columns.outputs = View.ocColumns;
            }

解決策 1

君の outputColumns クラスには、ComboBox での選択を追跡するためのコレクション (行ごと) はありません。むしろ、ViewModel にはグローバル コレクション (すべての行) しかありません。 これが、ComboBoxes ですべての行が同じ選択を表示する理由です。

コメント

タイトルとURLをコピーしました