0

いくつかの列を持つ WPF グリッド コントロールがあります。チェックボックス付きのcheckedit列もあります。

私が達成したいのは、ユーザーがグリッド コントロールで行を選択する (行をクリックする) ときに、チェックボックスが自動的にチェックされるようにすることです。

その後、ユーザーが別の行をクリックすると、新しく選択された行のチェックボックスがオンになり、以前に選択された行のチェックボックスがオフになります。

チェックボックスは無効になっているため、ユーザーは実際のチェックボックス自体をクリックする必要はありませんが、同じ行のどこかをクリックする必要があります。

基本的に、チェックボックスは、ユーザーがクリックした行を正確に示すインジケーターとして機能するため、たとえば削除ボタンをクリックしたときに正しいレコードがあることがわかります。

これが十分に説明的であることを願っています。

ありがとう

編集:申し訳ありません..DevExpressデータグリッドを使用していますが、以下の回答のプロパティを許可していないようです..

<!-- DX Grid with charges  -->
    <dxg:GridControl Grid.Row="1" Grid.ColumnSpan="7" FocusableChanged="FinanceOperationsGrid_FocusableChanged" Grid.RowSpan="6" DataSource="{Binding FinanceOperations}" x:Name="FinanceOperationsGrid">
        <dxg:GridControl.Columns>
            <dxg:GridColumn Width="20" AllowEditing="False" ShowInColumnChooser="False" AllowAutoFilter="False" />
            <dxg:GridColumn Width="20" UnboundType="Boolean" AllowEditing="True" ShowInColumnChooser="False" AllowAutoFilter="False">
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <dxe:CheckEdit x:Name="chkSelectedRow" IsThreeState="False" HorizontalAlignment="Center" VerticalAlignment="Center">
                        </dxe:CheckEdit>
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
            </dxg:GridColumn>
            <dxg:GridColumn Header="Created" AllowEditing="False" FieldName="Created" />
            <dxg:GridColumn Header="Operation type" AllowEditing="False" FieldName="OperationDisplay" />
            <dxg:GridColumn Header="Amount" AllowEditing="False" FieldName="Amount">
                <dxg:GridColumn.EditSettings>
                    <dxe:SpinEditSettings MaskType="Numeric" MaskUseAsDisplayFormat="True" Mask="c2" />
                </dxg:GridColumn.EditSettings>
            </dxg:GridColumn>
            <dxg:GridColumn Header="Description" AllowEditing="False" FieldName="Description" />
        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView BestFitArea="Header" BestFitMode="AllRows" AutoWidth="True" ShowGroupPanel="False" ShowAutoFilterRow="True" MultiSelectMode="Row" NavigationStyle="Row" 
                           RowStyle="{StaticResource AccountHistoryRowStyle}" DataRowTemplate="{StaticResource ChargeRowTemplate}" FocusedRow="{Binding SelectedOperation, Mode=TwoWay}">
                <dxg:TableView.Resources>
                    <DataTemplate x:Key="{dxgt:RowIndicatorThemeKey ResourceKey=FocusedIconTemplate}">
                        <Canvas Width="20" Height="20">
                            <Rectangle Fill="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Width="20" Height="20" />
                            <Polygon Points="5,5 5,15 10,10" Fill="Blue" />
                        </Canvas>
                    </DataTemplate>
                </dxg:TableView.Resources>
            </dxg:TableView>
        </dxg:GridControl.View>
    </dxg:GridControl>
4

2 に答える 2

1

イベントを使用でき、SelectedCellsChangedイベントハンドラーでアイテム全体を反復処理し、選択ブール値を False に設定します (NotifyPropertyChanged を介して通知するか、UI が変更を認識できるように Dependency プロパティであることを確認してください)。その後、送信者を次のように使用します。 Grid を作成し、彼の SelectedItems を反復処理して、選択したブール値を True に設定します。

.xaml:

    <DataGrid ItemsSource="{Binding MyItems}" SelectionMode="Single" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn IsReadOnly="True" Binding="{Binding Selected}"/>
            <DataGridTextColumn Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>

.cs:

public partial class MainWindow : Window
{

    public ObservableCollection<NameItem> MyItems { get; set; }
    public MainWindow()
    {
        MyItems = new ObservableCollection<NameItem>();
        MyItems.Add(new NameItem() { Name = "A" });
        MyItems.Add(new NameItem() { Name = "B" });
        DataContext = this;
        InitializeComponent();
    }



    private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (var item in MyItems)
        {
            item.Selected = false;
        }
        var datagrid = sender as DataGrid;
        if (datagrid != null)
            foreach (var item in datagrid.SelectedItems)
            {
                var nameItem = item as NameItem;
                if (nameItem != null) nameItem.Selected = true;
            }
    }

}
public class NameItem : DependencyObject
{
    public static readonly DependencyProperty SelectedProperty =
        DependencyProperty.Register("Selected", typeof (Boolean), typeof (NameItem), new PropertyMetadata(default(Boolean)));

    public Boolean Selected
    {
        get { return (Boolean) GetValue(SelectedProperty); }
        set { SetValue(SelectedProperty, value); }
    }
    public String Name { get; set; }
}
于 2013-06-01T13:58:58.440 に答える
1

グリッドにバインドされたコレクションのタイプのプロパティを定義する必要があり、データグリッドの SelectedItem をこのプロパティにバインドする必要があります。したがって、選択された行が変更されるたびに、このプロパティのセッターがトリガーされます。セッター内で、チェックボックスにバインドされたプロパティを適切な値に設定して、チェックボックスがオンになるようにします。

XAML

 <DataGrid  Grid.Row="1" SelectedItem="{Binding SelectedMilestoneItem}" Name="MilestoneGrid"
                    ItemsSource="{Binding MilestoneGridData}" 

ビューモデル

public MilestoneItemViewModel SelectedMilestoneItem
{
    get
    {
        return selectedMilestoneItem;
    }

    set
    {
        selectedMilestoneItem = value;
        selectedMilestoneItem.CheckBoxValue = true;
        NotifyPropertyChange("SelectedMilestoneItem");
    }
}
于 2013-06-01T13:59:11.477 に答える