2012-03-28 12 views
6

私がしようとしていることは「シンプル」なので、明らかに何かが不足していると思います。DataTriggerをチェックボックスのIsCheckedプロパティにバインドする

DataGridでは、CheckBoxをバインドしようとしていますが、チェックされるとその行の背景色が変更されるようにしています。すべての行に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); 

、私はDataTableのに自分のデータグリッドののItemsSourceを設定しているという事実であるが、私のチェックボックス列はありませんDataTableに対応する列があります。テンプレート列を別々に追加するだけで、おそらくこれが基盤となるストレージの不足がこの影響を及ぼしているのでしょうか?

詳細情報が必要な場合は、私にお知らせください。ありがとう!

+0

すべての私の答えは役に立ちましたか? – Phil

答えて

2

ここでは、DataSetではなくC#クラスを使用して私に役立つ例です。

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

答えをありがとう、私はデータセットを使用する選択肢がありませんが、あなたの投稿は私には、このブール値を保持するために何らかの形式の基底の記憶域が必要なことを教えてくれたので、列をDataTableに動的にバインドし、チェックボックスとDataTriggerの両方をバインドします。 –

関連する問題