Netanel Jerbi Ответов: 3

C# WPF - динамическое изменение цвета ячейки


Я создаю из c# Data-grid,который содержит таблицу данных и заполняет ее данными, затем у меня есть кнопка обновления, при нажатии на которую я хочу видеть ячейки, которые их значение было изменено в другом цвете(например, красный). Я довольно новичок в WPF, поэтому я действительно не понимаю, как это сделать из XML, и я создаю таблицы из кода, поэтому я тоже пытаюсь сделать это из кода. перепробовал все, и фон ячейки не меняется.
Спасибо всем, кто попытается помочь :)

пример кода для создания таблицы DataTable:

string TID =selectedTab.Header.ToString().Split('~')[1]; // (TableID, Lvl)

            List<Tuple<string,string>> FieldList = API.getFieldsByTableID(TID); // {(Field_name,size in bits),...}

            DataGrid dg = new DataGrid();
                DataTable dt = new DataTable();

            string[] TableLevel = splitTID(TID); //TableLevel[0]=Table ;TableLevel[1]=Level;  

            string TableDump = API.GetRegs(TableLevel[0], TableLevel[1]);// Getting debug dump from simics

            #endregion

            #region *Fields_row*
            foreach (var item in FieldList)  // First line ,name of fields.
            {
                dc = new DataColumn(item.Item1, typeof(string));
                dt.Columns.Add(dc);
            }
            #endregion

            TableDump = TableDump.Split(':')[1]; // split to get just the dump
            int x = 0;
            int DumpLen = TableDump.Length; // dump length
            int EntrySize = int.Parse(API.GetEntrySize(TID)); // return entry size
            int NumOfBytes = round_bits_2_chars_amount(EntrySize);
            int count = 0;
            while (x < DumpLen)
            {
                count++;
                String str_Entry = BE_to_LE(TableDump.Substring(x, NumOfBytes));

                ulong Entry = ulong.Parse(str_Entry, System.Globalization.NumberStyles.HexNumber);

                DataRow dr = dt.NewRow();
                int row = 0;
                dr[row++] = count;
                foreach (var item in FieldList)
                {
                    int FieldLen = int.Parse(item.Item2);
                    ulong Mask =(ulong) ((1 << FieldLen) - 1);
                    ulong Value = Entry & Mask;
                    Entry = Entry >> FieldLen;
                    if (Properties.Settings.Default.IsHexadecimal)
                    {

                        dr[row] = "0x" + Value.ToString("X");
                    }
                    else
                    {
                        dr[row] =Value.ToString();
                    }

                    row += 1;
                }

                 dt.Rows.Add(dr);
                x += EntrySize;
            }
             dg.ItemsSource = new DataView(dt);
            selectedTab.Content = dg;
       }
    }


код XAML :
<Window x:Name="MainWindow1" x:Class="Nagasaki.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:Nagasaki"
        mc:Ignorable="d"
        Title="Nagasaki" Height="464.839" Width="1021.708" WindowStartupLocation="CenterScreen" WindowStyle="ThreeDBorderWindow" ResizeMode="CanResizeWithGrip">
    <Window.Resources>

    </Window.Resources>
    <Grid Margin="0,-3,3,5.6">
        <TabControl x:Name="tabControl" Margin="0,5,0,-4.2" HorizontalAlignment="Left" Width="198" SelectedIndex="1">
            <TabItem Header="FXP" Margin="99,-2,-148.2,0" FontFamily="Century Gothic" VerticalAlignment="Top" Height="17">
                <ListBox x:Name="listBox" Margin="10,7,15.8,15.4"/>
            </TabItem>
            <TabItem Header="ETM" Margin="-49.8,-3,0,0" FontFamily="Century Gothic" Foreground="#FF060000" BorderThickness="0" VerticalAlignment="Top" Height="19" HorizontalAlignment="Left" Width="100">
                <ListBox x:Name="ETM_listBox" Margin="7,10,7.8,11.4"/>
            </TabItem>
        </TabControl>
        <Grid x:Name="GridButton" Margin="0,0,23,8.4" RenderTransformOrigin="0.5,0.5" MouseDown="GridButton_MouseDown" Width="29" HorizontalAlignment="Right" Height="25" VerticalAlignment="Bottom">
            <Grid.Background>
                <ImageBrush ImageSource="Red_Arrow_Head_Right-5121.png"/>
            </Grid.Background>
        </Grid>
        <Button x:Name="button2" Content="Connect IA" Margin="0,0,71.6,7.8" Foreground="Black" BorderBrush="#FFB33434" BorderThickness="0" Click="button2_Click" Width="122" Height="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Background="#FFBDC3CA"/>
        <Button x:Name="button" Content="Configuration" Margin="0,0,512.6,7.8" BorderThickness="0" Click="Configuration_Button_Click" RenderTransformOrigin="1.048,0.818" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="122" Background="#FFBDC3CA"/>
        <TabControl x:Name="DataTabControl" Margin="218,10,21.6,39.8" Background="#FFBCB3B3">

        </TabControl>
        <Button x:Name="CloseTabButton" Content="Close selected Tab" Margin="0,0,218.6,7.8" Background="#FFBDC3CA" BorderThickness="0" Click="button1_Click_1" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="122" Foreground="Black"/>
        <Button x:Name="CloseAllTabButton" Content="Close All Tabs" Margin="0,0,365.6,7.8" Background="#FFBDC3CA" BorderThickness="0" Height="25" Click="CloseAllTabButton_Click" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="122"/>
        <Button x:Name="RefreshButton" Content="Refresh table" Margin="0,0,659.6,8.4" BorderThickness="0" Click="Refresh_Button_Click" RenderTransformOrigin="1.048,0.818" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="122" Background="#FFBDC3CA"/>
    </Grid>
</Window>


Что я уже пробовал:

поискал в google и не нашел ответа на свою проблему.

Clifford Nelson

Вы должны включить свой XAML.

3 Ответов

Рейтинг:
20

Graeme_Grant

А быстро поиск Google[^] появился этот загружаемый пример, который должен делать то, что вы хотите: Мигание ячейки DataGrid - как это сделать правильно[^]


Netanel Jerbi

Я не понимаю, как он это сделал ( как я уже сказал в посте, я не понимаю XAML), если вы можете объяснить, что я должен сделать, чтобы заставить его работать на меня(или если у вас есть какое-то видео или что-то, чтобы прочитать об этом, может быть здорово). Спасибо!!

Graeme_Grant

- Я не понимаю, как он это сделал... Пометка решения до 1 из 5 только потому, что вы не понимаете, что такое рабочее решение, не поможет вам. Нам не платят и мы не обязаны помогать вам, мы делаем это потому, что хотим помочь. Пожалуйста, проявите немного уважения.

Чтобы помочь вам лучше понять ответ, он использует Привязка Данных (Microsoft Docs)[^] уведомления для запуска Анимация (Microsoft Docs)[^] событие. Чтобы это сработало, вам нужно установить DataContext для элемента управления и реализовать INotifyPropertyChanged (Microsoft Docs)[^] интерфейс для привязки данных.

Clifford Nelson

Пока вы не поймете XAML, вы не должны работать с WPF. Смысл WPF-это XAML. Это декларативный язык. Если вы не хотите иметь дело с XAML перейдите в WinForms

Graeme_Grant

ваш комментарий предназначался мне или оператору?

Рейтинг:
2

Clifford Nelson

Очевидно, не вы, тот, кто задает вопрос...извините за путаницу.


Graeme_Grant

Кому ты отвечаешь? Я думаю, что ты нажимаешь не на те кнопки...

Рейтинг:
1

Clifford Nelson

Я бы рекомендовал вам использовать CellStyle, который может быть связан с at . Затем вы можете использовать привязку в стиле, чтобы изменить атрибуты, необходимые для DataGridColumn. При необходимости вы можете использовать IValueConverter в привязке для преобразования в кисть для фона в CellStyle


Netanel Jerbi

не могли бы вы привести мне какой-нибудь пример, пожалуйста?