2012-03-28 24 views
6

Yapmaya çalıştığım şeyin "basit" olması gerektiğine inanıyorum, bu yüzden açık bir şey eksik.Bir DataTrigger'ın bir onay kutusunun IsChecked özelliğine bağlanması

Bir DataGrid'de bir CheckBox'a bağlanmaya çalışıyorum, böylece işaretlendiğinde, satırının Arka Plan rengi değişecektir. Her satırda bir CheckBox var. Temel olarak kendi çoklu çoklu satır işlevlerimi uyguluyor (bu bir ürün gereksinimi, sorma) ve başka bir şey var, ancak seçilen bir satırın bu görsel belirtimi var.

this question okudum ama cevabım eksik olduğu yerde "BooleanPropertyOnObjectBoundToRow" olarak koymak tam olarak nedir. Ayrıca this question'a baktım ve bir RelativeSource ile uğraşmaya çalıştım ama şanssız.

benim kod arkada benim ızgara oluşturmak, ama burada (benim DataTrigger tanımlamıştır) satırlar için kullanılan benim şimdiki tarzı:

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

Şimdi benim kod arkasında, benim DataGridTemplateColumn oluşturmak ve burada benim onay kutularını oluşturmak için bir Fabrikası kullanın ve benim Bağlama-ilgili koddur:

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

ilgisini çekebilir Ben bir DataTable'a benim DataGrid ItemsSource set aslında ama benim CheckBox sütun dEĞİL ne yapar DataTable'da karşılık gelen bir sütun var. Sadece şablon sütununu ayrı olarak ekledim, belki de bu temel depolama eksikliği bunu etkiliyor mu?

Daha fazla bilgiye ihtiyacınız varsa, lütfen bana bildirin. Teşekkürler!

+0

hiç cevabım yardımcı oldu mu? – Phil

cevap

2

Burada bir DataSet değil, C# sınıflarını kullanan bir örnek var.

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

Yanıt için teşekkürler, bir DataSet kullanma seçeneğim olmasa da, postanızın bana söylediği şey, bu boolean değerini tutmak için bir miktar temel depolama alanına ihtiyacım olmasıdır, bu yüzden yaptığım şey bir boolean ekleymekti DataTable'ımın sütununu dinamik olarak kullan ve hem onay kutum hem de DataTrigger'ı buna bağla, ve sonra! –