Привязка DataTrigger к свойству IsChecked флажка - PullRequest
6 голосов
/ 29 марта 2012

Я считаю, что то, что я пытаюсь сделать, достаточно "просто", поэтому я, вероятно, просто упускаю что-то очевидное.

В DataGrid я пытаюсь привязать CheckBox, чтобы, когда онотмечен, цвет фона его строки будет меняться.У каждой строки есть CheckBox.Я в основном реализую свою собственную функцию выбора нескольких строк (это требование продукта, не спрашивайте), и у меня все остальное работает, кроме этой визуальной индикации выбранной строки.

Я прочитал этот вопрос но мне не хватает ответа, что именно поставить как "BooleanPropertyOnObjectBoundToRow".Я также посмотрел на этот вопрос и попытался связываться с 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 и использую Factory для создания своих флажков, а вот мой код, связанный с привязкой:

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

Что может представлять интерес, так это тот факт, что я установил ItemsSource моей DataGrid в DataTable, но в моем столбце CheckBox НЕ имеется соответствующего столбца в DataTable.Я просто добавляю столбец шаблона отдельно, может быть, это влияет на отсутствие базового хранилища?

В любом случае, если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Спасибо!

1 Ответ

2 голосов
/ 31 марта 2012

Вот пример, который работает для меня с использованием классов 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); }
    }
}
...