2012-03-28 9 views
6

Credo che quello che sto cercando di fare sia abbastanza "semplice", quindi probabilmente mi manca semplicemente qualcosa di ovvio.Associazione di un DataTrigger alla proprietà IsChecked di una casella di controllo

In un DataGrid, sto tentando di associare un CheckBox in modo che quando viene selezionato, il colore di sfondo della sua riga cambierà. Ogni riga ha un CheckBox. Fondamentalmente sto implementando la mia funzionalità select-multiple-rows (è un requisito di prodotto, non chiedo), e ho tutto il resto a lavorare, ma questa indicazione visiva di una riga selezionata.

Ho letto this question ma dove mi manca la risposta è esattamente cosa mettere come "BooleanPropertyOnObjectBoundToRow". Ho anche guardato allo this question e ho provato a fare confusione con una RelativeSource ma senza fortuna.

Creo il mio griglia nel mio code-behind, ma qui è il mio stile corrente utilizzato per le righe (che ha definito la mia DataTrigger):

<Style x:Key="MyRowStyle" TargetType="DataGridRow"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
       <Setter Property="Background" Value="Blue"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

Ora nel mio code-behind, Creo il mio DataGridTemplateColumn e utilizzare una fabbrica per creare le mie caselle di controllo, ed ecco la mia Binding-rilevanti codice:

Binding checkBinding = new Binding("IsChecked"); 
checkBinding.Mode = BindingMode.OneWayToSource; 
RelativeSource relativeSource = new RelativeSource(); 
relativeSource.AncestorType = typeof(DataGridRow); 
relativeSource.Mode = RelativeSourceMode.FindAncestor; 
checkBinding.RelativeSource = relativeSource; 
factory.SetBinding(CheckBox.IsCheckedProperty, checkBinding); 

ciò che può essere di interesse è il fatto che ho impostato l'ItemsSource del mio DataGrid a un DataTable, ma la mia colonna casella di controllo non fa avere una colonna corrispondente nel DataTable. Semplicemente aggiungo la colonna del template separatamente, forse questa mancanza di storage sottostante sta influenzando questo?

In ogni caso se avete bisogno di ulteriori informazioni, fatemelo sapere. Grazie!

+0

Forse la mia risposta aiuto a tutti? – Phil

risposta

2

Ecco un esempio che funziona per me utilizzando le classi C#, non un DataSet.

Xaml

<Page.Resources> 
    <Style x:Key="RowStyle" TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
       <Setter Property="Background" Value="Blue"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Page.Resources> 

<Page.DataContext> 
    <Samples:DataGridRowHighlightViewModels/> 
</Page.DataContext> 

<Grid> 
    <DataGrid ItemsSource="{Binding Items}" RowStyle="{StaticResource RowStyle}" CanUserAddRows="False" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Header="Selected" Binding="{Binding IsChecked}"/> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

C#

public class DataGridRowHighlightViewModels 
{ 
    public DataGridRowHighlightViewModels() 
    { 
     Items = new List<DataGridRowHighlightViewModel> 
        { 
         new DataGridRowHighlightViewModel {Name = "one"}, 
         new DataGridRowHighlightViewModel {Name = "two"}, 
         new DataGridRowHighlightViewModel {Name = "three"}, 
         new DataGridRowHighlightViewModel {Name = "four"}, 
        }; 
    } 
    public IEnumerable<DataGridRowHighlightViewModel> Items { get; set; } 
} 

// ViewModelBase and Set() give INotifyPropertyChanged support (from MVVM Light) 
public class DataGridRowHighlightViewModel : ViewModelBase 
{ 
    private bool _isChecked; 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set { Set(()=>IsChecked, ref _isChecked, value); } 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { Set(()=>Name, ref _name, value); } 
    } 
} 
+1

Grazie per la risposta, anche se non ho scelta di usare un DataSet, quello che il tuo post mi ha detto è che ho bisogno di qualche forma di storage sottostante per mantenere questo valore booleano, quindi quello che ho fatto è stato aggiungere un booleano colonna al mio DataTable in modo dinamico e associare sia la mia casella di controllo e DataTrigger a questo, et voilà! –

Problemi correlati