【问题标题】:WPF DataGrid SelectionChanged Row ColorWPF DataGrid SelectionChanged 行颜色
【发布时间】:2012-06-04 15:41:23
【问题描述】:

如果 WPF DataGrid 的 SelectionChanged 事件中的条件为真,我想更改整行的颜色。如果我使用 arg DataGridRowEventArgs e,我可以更改 LoadingRow 事件中的颜色。我可以使用 e.Row.Background = new SolidColorBrush(Colors.White)。但这在 SelectionChangedEvent 中不起作用。如何从 DataGrid 转换为 DataGridRow 以使用 DataGridRow.Row.Background = new SolidColorBrush(Colors.White)? 感谢您的理解。

    private void grd_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {

         int iIndex = grd.SelectedIndex;
         SolidColorBrush myColor = new SolidColorBrush(Colors.Tomato);

         if (grd.SelectedItem != null)
         {
             // var datagridrow = grd.SelectedItem as DataGridRow; --> dosent'work
             var drw = grd.SelectedItem as DataRowView;



             DataRow row = drw.Row;
             if (Convert.ToBoolean(row["Checkbox"]) == true)
             {
                 row["Checkbox"] = false;
             }
             else
             {
                 row["Checkbox"] = true;    
                 // change the background color of the row too what ever  
                 // white red blue                          
              }
         }
    }

================================================ ===================================

这里是 xaml 和代码。非常感谢

MainWindow.xaml.cs

     namespace DataGridBrushRowColor
    {

       public partial class MainWindow : Window
    {
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        CreateTable myDog = new CreateTable();
        // Lade Daten
        dataGrid1.AutoGenerateColumns = true;

        DataView myView = new DataView(myDog.DogOutput);
        dataGrid1.DataContext = myView;            
    }

    private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var rowview = dataGrid1.SelectedItem as DataRowView;
        if (rowview != null)
        { 
            DataRow row = rowview.Row;
            if (Convert.ToBoolean(rowview["Choice"]) == true)
            {
                row["Choice"] = false;
            }
            else
            {
                row["Choice"] = true;
                // Color the whole row red

            }
        }


     }
     }
     }

MainWindow.xaml

     <Window x:Class="DataGridBrushRowColor.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MainWindow" Height="350" Width="525">
    <Grid>
    <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Height="243" Width="503" ItemsSource="{Binding}" SelectionChanged="dataGrid1_SelectionChanged" >

    </DataGrid>
    <Button Content="Button" Height="26" HorizontalAlignment="Left" Margin="12,249,0,0" Name="button1" VerticalAlignment="Top" Width="100" Click="button1_Click" />
</Grid>

CreateTable.cs

    namespace DataGridBrushRowColor
    {
        class CreateTable
        {
            DataTable dtDog;

    public DataTable DogOutput
    {
        get
        {
            return dtDog;
        }
    }


    public CreateTable()
    {
        // Here we create a DataTable with four columns.
        DataTable table = new DataTable();
        table.Columns.Add("Choice", typeof(Boolean));
        table.Columns.Add("Weight", typeof(int));
        table.Columns.Add("Name", typeof(string));
        table.Columns.Add("Breed", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        // Here we add five DataRows.            
        table.Rows.Add(false,57, "Koko", "Shar Pei", DateTime.Now);
        table.Rows.Add(false,130, "Fido", "Bullmastiff", DateTime.Now);
        table.Rows.Add(false, 92, "Alex", "Anatolian Shepherd Dog", DateTime.Now);
        table.Rows.Add(false, 25, "Charles", "Cavalier King Charles Spaniel", DateTime.Now);
        table.Rows.Add(false, 7, "Candy", "Yorkshire Terrier", DateTime.Now);
        dtDog = table;


    }

    }
    }

【问题讨论】:

    标签: wpf datagrid colors row selectionchanged


    【解决方案1】:

    您可以通过使用如下样式和触发器来实现相同的目标。

      <Window.Resources>
            <local:MyColorConverter x:Key="colorconverter" />
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{Binding Converter={StaticResource colorconverter}}" /> 
                     </Trigger>              
                </Style.Triggers>
            </Style>
        </Window.Resources>
    

    ..chagnes 后面的代码

    public class MainWindow:Windows
    {
    your codes.
    }
    
     public class MyColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                SolidColorBrush brush = new SolidColorBrush(Colors.Black);
                bool result = false;
                if (value != null)
                {
                    DataRowView drv = value as DataRowView;
                    try
                    {
                        if (drv != null)
                            if (Boolean.TryParse(drv.Row["Choice"].ToString(), out result))
                            {
                                if (result)
                                    brush = new SolidColorBrush(Colors.Red);
    
                                else if (result == false)
                                    brush = new SolidColorBrush(Colors.YellowGreen);
                            }
                    }
                    catch { }
                }
                return brush;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    【讨论】:

    • 这并不容易。在我将触发器放入 XAML 后,我没有空的 ItemsSource 喷气机,整个 BusinessLogic 都崩溃了。是否有另一种选择来为行上墨?
    • 好的,我将代码和示例提取并发送给您。非常感谢您的支持。
    • 嗨 Jodha,我已经编辑了第一篇文章以传递您的 xaml 和代码。最好的问候斯文
    • 我将 MyColorConverter 类以及 Convert 和 ConvertBack 方法赋予命名空间“DataGridBrushRowColor”。我在 XAML 窗口属性下方添加了 Windows.Resources 标记。我尝试添加对类“xmlns:local="DataGridBrushRowColor:MyColorConverter">”的引用,但出现错误:标记 MyColorConverter 在 XML 命名空间中不可用。如果我删除引用,则会收到错误:未声明本地。我的错在哪里?
    • 试试这个 xmlns:local="clr-namespace:DataGridBrushRowColor:MyColorConverter" 这应该在你添加本地命名空间时工作,然后你必须添加 clr-namespace: 然后你的命名空间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2016-05-03
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2012-02-12
    相关资源
    最近更新 更多