-1

我花了很多时间尝试在 CheckBox 单击事件上更改行文本颜色。

因此,如果选中复选框,我们需要将颜色设置为灰色,如果未选中复选框,则将其恢复为正常颜色。

请帮助获得此结果(DataGrid 绑定到 xml 文件)。

更新。一些代码:

XAML 用于基于选中列(复选框)更改行颜色:

<Window.Resources>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Foreground" Value="{Binding Checked, Converter={x:Static local:MainWindow.rowCheckedConverter}}" />
    </Style>
</Window.Resources>

...
<Grid.DataContext>
   <XmlDataProvider x:Name="userTasksProvider" XPath="UserTasks" />
</Grid.DataContext>
...

<DataGrid Name="dgUserTasks" Grid.Column="1" Margin="1,0,0,0"
   AutoGenerateColumns="False" HeadersVisibility="None"
   ItemsSource="{Binding XPath=Task}">

   <DataGrid.Columns>
   <DataGridCheckBoxColumn x:Name="cbUserTasksColumn" Width="20"
      Binding="{Binding Checked,
      Mode=TwoWay}" Header="">
   </DataGridCheckBoxColumn>

   <DataGridTextColumn 
      x:Name="Info" Width="*"
      Binding="{Binding Info,
      Mode=TwoWay}"
      Header="" >
   </DataGridTextColumn>
...

C#WPF:

    public partial class MainWindow : Window
    {
        public static RowCheckedConverter rowCheckedConverter = new RowCheckedConverter();
        ...
    }

    ...

    public class RowCheckedConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

            if ((bool)value) {
                return new SolidColorBrush(Colors.Gray);
            }
            else {
                return new SolidColorBrush(Colors.Black);
            }

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            throw new Exception("The method or operation is not implemented.");
        }
    }       
4

2 回答 2

1

你的问题很模糊,但我会尽力提供帮助。

考虑这个例子:

 <DataGrid ItemsSource="{Binding DataSet}" AutoGenerateColumns="False">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsActive}" Value="False">
                        <Setter Property="Foreground" Value="Gray"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}">
            </DataGridTextColumn>
            <DataGridCheckBoxColumn Binding="{Binding IsActive, Mode=TwoWay}">

            </DataGridCheckBoxColumn>

        </DataGrid.Columns>
    </DataGrid>

和代码:

public partial class MainWindow : Window
{
    public ObservableCollection<Data> DataSet { get; set; }

    public MainWindow()
    {
        DataSet = new ObservableCollection<Data>();
        DataSet.Add(new Data { Name = "First" });
        DataSet.Add(new Data { Name = "Second" });
        DataSet.Add(new Data { Name = "Third" });
        InitializeComponent();
        DataContext = this;
    }

}

public class Data
{
    public string Name { get; set; }

    public bool IsActive { get; set; }
}

在此代码段中,我将复选框列绑定到 Data 实例中的属性,并在此属性为 false 时添加样式触发器。这就是你要找的东西吗?

问题更新后编辑

我在您提供的代码中看不到您的样式分配给 DataGrid 的位置:

<DataGrid  RowStyle="{StaticResource myStyle}" ...>

并且您的样式未声明 x:Key 属性。

如果您添加它,它将起作用,但静态字段/属性闻起来很糟糕。考虑改为:

<Style TargetType="DataGridRow" x:Key="myStyle">
    <Style.Triggers>
          <DataTrigger Binding="{Binding Checked}" Value="False">
               <Setter Property="Foreground" Value="Gray"/>
          </DataTrigger>
    </Style.Triggers>
</Style>

如果您决定使用转换器,请考虑更改为:

<Style TargetType="{x:Type DataGridRow}" x:Key="myStyle">
    <Setter Property="Foreground" >
        <Setter.Value>
            <Binding Path="Checked">
                <Binding.Converter>
                    <local:RowCheckedConverter />
                </Binding.Converter>
            </Binding>
        </Setter.Value>
    </Setter>
</Style>

这也将消除这个领域。

于 2012-07-10T06:54:48.157 回答
0

使用如下所示的转换器:http: //timheuer.com/blog/archive/2008/07/30/format-data-in-silverlight-databinding-valueconverter.aspx

于 2012-07-10T06:56:57.830 回答