2013-06-01 91 views
0

我有一些WPF Grid Control控件。我也有checkit欄和一個複選框。WPF GridControl:自動勾選複選框,當行被聚焦並且未點擊未聚焦

我希望完成的是當用戶在網格控件中選擇一行(單擊一行)時,我希望自動檢查複選框。

然後,當用戶單擊不同的行時,新選定行中的複選框將被選中,並且先前選定行中的複選框將被取消選中。

複選框被禁用,因此用戶不需要點擊實際的複選框本身,而是在同一行的任何位置。

基本上這個複選框是作爲一個指示器,向用戶顯示他們點擊哪一行,以便他們知道他們在點擊刪除按鈕時有正確的記錄。

希望這是足夠描述性的。

感謝

編輯:對不起所有..即時通訊使用的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> 
+0

如果你表現出的DataGrid和的的SelectedItem(如果處理)代碼,這將是相對更容易幫助你。 – Jatin

回答

1

你必須定義綁定到數據網格的網格和的SelectedItem集合類型的屬性應該綁定到這個屬性。所以每當選中的行更改setter這個屬性被觸發。在setter中將綁定到複選框的屬性設置爲適當的值,以便勾選複選框。

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"); 
    } 
} 
+0

選定的答案,因爲它回答了我最接近我的需求的原始問題。謝謝你們的時間來回答我的問題。非常感激。投票也給了兩者 – Kev

1

您可以使用SelectedCellsChanged事件,在你的事件處理器中迭代你的項目並將選擇布爾值設置爲False(確保它通過NotifyPropertyChanged通知或者是一個Dependency屬性,這樣UI就會知道這個變化),然後使用sender作爲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; } 
}