2012-03-28 99 views
6

我相信我所要做的只是「簡單」,所以我可能只是錯過了一些明顯的東西。將DataTrigger綁定到複選框的IsChecked屬性

在一個DataGrid中,我試圖綁定一個CheckBox,這樣當它被選中時,其行的Background顏色將會改變。每行都有一個CheckBox。我基本上實現了自己的select-multiple-rows功能(這是一個產品需求,不要問),而且我還有其他的工作,但是這個視覺指示了選定的行。

我讀過this question但我缺少我的答案是「BooleanPropertyOnObjectBoundToRow」。我也看過this question,並試圖與一個RelativeSource混淆,但沒有運氣。

創建我的網格在我的代碼隱藏,但這裏是我用於行當前的樣式(其中有我DataTrigger定義):

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

現在在我的代碼隱藏,我創造我DataGridTemplateColumn和使用一個工廠來創建我的複選框,並在這裏是我的綁定相關代碼:

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); 

什麼可能感興趣的是,我把我的DataGrid的ItemsSource時到DataTable,但我複選框列不在DataTable中有相應的列。我只是單獨添加模板列,也許這種底層存儲的缺乏會影響到這一點?

無論如何,如果您需要更多信息,請讓我知道。謝謝!

+0

難道我的回答幫助呢? – Phil 2012-04-10 18:52:49

回答

2

下面是一個適用於我使用C#類而不是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

感謝您的回答,雖然我沒有使用DataSet的選擇,但是您的帖子告訴我的是,我確實需要某種形式的基礎存儲來保存此布爾值,所以我所做的是我追加了一個布爾值列到我的DataTable動態和綁定我的複選框和DataTrigger到,瞧! – 2012-04-13 18:09:05

相關問題