wpf datagrid绑定的Row[状态]=“PASS“已经改为PASS了 界面也显示PASS了,但颜色没有变,滚动滚动条被遮住的datagrid颜色才变了,列表中每行颜色需要实时更新

列表中每行颜色需要实时更新

问题:我已经用触发颜色绑定了值,但是值变了,颜色没变

坑人的WPF
在这里插入图片描述

                     Dispatcher.Invoke((Action)(() => {
                    bindingList[index].DataGridCollection = null;
                    bindingList[index].DataGridCollection = downList[index].dataTable.DefaultView;//行

                    //DataGrid myDataGrid = (DataGrid)MyAPI.getControl(myListBox, index, "myDataGrid");
                    //myDataGrid.UpdateLayout(); //不行
                    //myDataGrid.Items.Refresh();//行
                    // 假设 'myDataGrid' 是你的 DataGrid,'DataGridCollection' 是数据源。
                    //myDataGrid.ItemsSource = null;
                    //myDataGrid.ItemsSource = downList[index].dataTable.DefaultView;//不行

                    //BindingOperations.GetBindingExpression(myDataGrid, DataGrid.BackgroundProperty)?.UpdateTarget();//不行
                }));

你遇到的问题是 DataGrid 的行颜色在状态变化时没有立即更新,只有在滚动 DataGrid 后才会改变。这通常是因为 DataGrid 没有在数据更改时及时刷新它的视觉状态。以下是一些解决方法,帮助你实现实时更新:

解决方案:强制 DataGrid 实时刷新行

  1. 确保属性更改通知(这个之前就加了,不然界面的值不会变)
    确保你的数据模型(例如,状态)实现了 INotifyPropertyChanged 接口,以便数据变化时能自动通知 UI 更新。以下是一个实现该接口的示例:

    public class MyRowData : INotifyPropertyChanged
    {
        private string status;
        public string Status
        {
            get { return status; }
            set
            {
                if (status != value)
                {
                    status = value;
                    OnPropertyChanged(nameof(Status));
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
  2. 触发 DataGrid 行更新
    如果上面的实现是正确的,但 DataGrid 仍然不能立即更新,你可能需要手动触发 DataGrid 的视觉刷新。以下是一些方法:

    • 通过重置 ItemSource 强制 DataGrid 刷新(不行,用了控件方式):可以在更改数据后,将 DataGrid 的 ItemsSource 重置为自己:

      // 假设 'myDataGrid' 是你的 DataGrid,'DataGridCollection' 是数据源。
      myDataGrid.ItemsSource = null;
      myDataGrid.ItemsSource = DataGridCollection;
      
    • 使用 UpdateLayout 刷新特定行(不行,用了控件方式):在更改后调用 UpdateLayout()

      myDataGrid.UpdateLayout();
      
  3. 使用 Dispatcher 强制 UI 更新(有效,但用了控件方式)
    如果实时反映变化仍然存在问题,可以使用 Dispatcher 强制 UI 刷新:

    Application.Current.Dispatcher.Invoke(() =>
    {
        myDataGrid.Items.Refresh();
    });
    
  4. 检查绑定模式(试了无效)
    确保绑定模式为 TwoWay,以确保数据和 UI 之间的双向绑定:

    <DataGrid ItemsSource="{Binding DataGridCollection, Mode=TwoWay}">
        <!-- DataGrid 配置 -->
    </DataGrid>
    

通过以上方法,你的 DataGrid 行在状态更改后应该能实时反映颜色变化,而不需要滚动来触发。如果问题仍未解决,可能需要进一步检查绑定上下文或数据流。

不行

                await Application.Current.Dispatcher.InvokeAsync(() =>
                {
                    // 更新绑定属性                      
                    dataTable.Rows[i]["状态"] = i<3?"PASS":"FAIL";
                });

界面

<Window x:Class="WpfM20UpdateFW.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfM20UpdateFW"
        mc:Ignorable="d"
        Title="FT_MultiUart Tool V2.7   " Height="600" Width="800" WindowState="Maximized"  Closed="Window_Closed" KeyDown="Window_KeyDown" Loaded="Window_Loaded">

    <Window.Resources>
        <RoutedUICommand x:Key="download" Text="download"/>
        <RoutedUICommand x:Key="download_concel" Text="download_concel"/>
        <RoutedUICommand x:Key="settings" Text="settings"/>
    </Window.Resources>
    <Window.InputBindings>
        <KeyBinding Gesture="Alt+D" Key="D"  Command="{StaticResource download}"></KeyBinding>
        <KeyBinding Gesture="Alt+C" Key="C"  Command="{StaticResource download_concel}"></KeyBinding>
        <KeyBinding Gesture="Alt+S" Key="S"  Command="{StaticResource settings}"></KeyBinding>

    </Window.InputBindings>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource download}" CanExecute="Button_Click_Download"></CommandBinding>
        <CommandBinding Command="{StaticResource download_concel}" CanExecute="Button_Click_DownloadCancel"></CommandBinding>
        <CommandBinding Command="{StaticResource settings}" CanExecute="Button_Click_Settings"></CommandBinding>
    </Window.CommandBindings>

    <Grid ShowGridLines="false" MinWidth="20" FocusManager.FocusedElement="{Binding ElementName=download}" Grid.ColumnSpan="4">
        <Grid.RowDefinitions>
            <RowDefinition  Height="30"></RowDefinition>
            <RowDefinition  Height="*"></RowDefinition>

        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.1*"></ColumnDefinition>
            <ColumnDefinition Width="0.1*"></ColumnDefinition>
            <ColumnDefinition Width="0.1*"></ColumnDefinition>
            <ColumnDefinition Width="0.1*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <!--<TextBox Grid.Row="0" Grid.Column="0"  x:Name="Path" IsReadOnly="True"/>-->
        <Button Grid.Row="0" Grid.Column="0" FontSize="20" FontWeight="Bold" Margin="5,0,5,0"  x:Name="settings" Click="Button_Click_Settings">Settings</Button>
        <Button Grid.Row="0" Grid.Column="3" FontSize="20" FontWeight="Bold" Margin="50,0,5,0" x:Name="download" IsDefault="True" Click="Button_Click_Download" >Start</Button>
        <TextBlock Grid.Row="0" Grid.Column="1"  Grid.ColumnSpan="2" x:Name="textBlockDevice" FontFamily="黑体" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding DeviceCount}"/>

        <ListBox x:Name="myListBox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel x:Name="myStackPanel" Orientation="Vertical" Background="AliceBlue" Margin="1 0 0 0" Width="300" Height="{Binding ActualHeight, ElementName=myListBox, Mode=OneWay}">
                        <TextBlock x:Name="myCom" Text="{Binding Path=Name}" FontFamily="黑体" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        <DataGrid x:Name="myDataGrid" AutoGenerateColumns="True"  MaxHeight="400" IsReadOnly="True" ItemsSource="{Binding DataGridCollection}">
                            <DataGrid.RowStyle>
                                <Style TargetType="DataGridRow">
                                    <Setter Property="Background" Value="White" />
                                    <Style.Triggers>
                                        <!-- 这里是根据条件来设置颜色,假设你想要将满足某个条件的行背景设置为绿色 -->
                                        <DataTrigger Binding="{Binding Row[状态]}" Value="PASS">
                                            <Setter Property="Background" Value="Green" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Row[状态]}" Value="FAIL">
                                            <Setter Property="Background" Value="Red" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Row[状态]}" Value="SKIP">
                                            <Setter Property="Background" Value="Gray" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </DataGrid.RowStyle>
                        </DataGrid>



                        <TextBlock x:Name="myStatus" Text="{Binding Path=Status}" FontFamily="黑体" FontSize="40"  FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock.Style>
                                <Style TargetType="TextBlock">
                                    <Setter Property="Foreground" Value="White" />
                                    <Style.Triggers>
                                        <!-- 这里是根据条件来设置颜色,假设你想要将满足某个条件的行背景设置为绿色 -->
                                        <DataTrigger Binding="{Binding Status}" Value="PASS">
                                            <Setter Property="Foreground" Value="Green" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Status}" Value="FAIL">
                                            <Setter Property="Foreground" Value="Red" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Status}" Value="SKIP">
                                            <Setter Property="Foreground" Value="Gray" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Status}" Value="READY">
                                            <Setter Property="Foreground" Value="Black" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                        <TextBox x:Name="myLog" Text="{Binding Path=Log}" Height="Auto" MinHeight="100" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" AcceptsReturn="True" IsReadOnly="True" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值