将DataTrigger绑定到复选框的IsChecked属性

6

我相信我想做的事情足够“简单”,所以我可能只是漏掉了一些显而易见的东西。

在DataGrid中,我试图绑定一个复选框,以便当它被选中时,其行的背景颜色会改变。每一行都有一个复选框。我基本上正在实现自己的选择多行功能(这是产品要求,请勿询问),除了这个可视化指示已选择的行之外,我已经做好了其他所有事情。

我阅读了这个问题,但我缺乏答案的地方是在“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,并使用工厂来创建复选框,下面是与绑定相关的代码:

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,但我的CheckBox列在DataTable中没有对应的列。我只是单独添加了模板列,也许这种缺乏基础存储正在影响它吗?
无论如何,如果您需要更多信息,请告诉我。谢谢!
1个回答

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绑定到它上面,et voila! - WPFNewbie Wannabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接