2012-07-10 54 views
-1

我花了很多时间尝试在CheckBox单击事件中更改行文本颜色。如何更改DataGrid单击复选框上的行颜色?

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

请帮忙得到这个结果(DataGrid绑定到xml文件)。

Upd。有些代码:

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."); 
     } 
    }  
+0

提供一些代码,请... – Tigran 2012-07-10 06:40:25

+0

-1,因为如果该复选框布尔值是集合的ItemsSource的一部分,它是不是没有说明。这对于答案是至关重要的。提供一些代码,我会删除downvote,你也会得到一些更好的帮助;) – blindmeis 2012-07-10 09:30:17

+0

谢谢,提供的源代码。 – 2012-07-10 11:17:34

回答

0

你的问题是相当模糊,但我会尽力帮助。

考虑这个例子:

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

在这个片段中我必然复选框列在数据实例属性,并添加样式触发时,这个属性是假的。这是你在哪里寻找?

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

和你的风格不x声明:Key属性问题更新

我不能在代码中看到您提供您的风格被分配给数据网格后

编辑。

如果你添加它,它会工作,但静态fied /属性只是味道不好。考虑更换为:

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

这也将消除这一领域。

+0

拉法尔,非常感谢你的快速回答。你的代码似乎工作。但我不能使它与XmlDataProvider(绑定到XML文件)... – 2012-07-10 11:12:28

+0

再次感谢。好的解决方案这是完全可行的。 – 2012-07-10 12:17:41

+0

如果你说答案是正确的/有帮助的,那你为什么不接受它? – Rafal 2012-07-12 18:48:55