Laden...

[gelöst] ListView: Geänderter Wert einer Zelle farblich kennzeichnen

Erstellt von Wirsing22 vor 5 Jahren Letzter Beitrag vor 5 Jahren 996 Views
W
Wirsing22 Themenstarter:in
2 Beiträge seit 2018
vor 5 Jahren
[gelöst] ListView: Geänderter Wert einer Zelle farblich kennzeichnen

Hallo!

Habe hier folgende Codefragmente:


        <ListView x:Name="view">
            <ListView.View>
                <GridView>
                    <GridView.Columns>

                        <GridViewColumn Header="Name1" Width="100"  >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding Name1,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" SourceUpdated="x" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <GridViewColumn Header="Name2" Width="100" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox  Text="{Binding Name2,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" SourceUpdated="x" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <GridViewColumn Header="Name3" Width="80">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding Name3,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" SourceUpdated="x" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>


  public partial class MainWindow : Window
    {
        List<Data> data = null;

        public MainWindow()
        {
            InitializeComponent();
   
            data = new List<Data>();

            //Werte erstellen
            for (int i = 0; i < 40; i++)
            {
                Data x = new Data(i + "0", i + "1", i + "2");
                data.Add(x);
            }

            view.ItemsSource = data;

        }

        class Data : INotifyPropertyChanged
        {
            string _name1;
            public string Name1
            {
                get { return _name1; }
                set { _name1 = value; OnPropertyChanged("Name1"); }
            }

            string _name2;
            public string Name2
            {
                get { return _name2; }
                set { _name2 = value; OnPropertyChanged("Name2"); }
            }

            string _name3;
            public string Name3
            {
                get { return _name3; }
                set { _name3 = value; OnPropertyChanged("Name3"); }
            }

            public event PropertyChangedEventHandler PropertyChanged;

            public Data(string a, string b, string c)
            {
                Name1 = a;
                Name2 = b;
                Name3 = c;

            }

            protected void OnPropertyChanged(string infoText)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(infoText));
                }
            }
        }

        private void mouseDown(object sender, MouseButtonEventArgs e)
        {
            //Wert einer TextBox indirekt ändern
            Data d = view.Items[1] as Data;
            d.Name1 = "55";
        }

        private void x(object sender, DataTransferEventArgs e)
        {
             //TextBox "X" Farbe ändern
        }
    }

Zur Erklärung:

Es soll also eine ListView (view) erstellt werden mit 3 Spalten (Name1,..2,..3). Dort werden dann 40 Zeilen mit Werten ausgegeben. Durch Änderung eines Wertes in einer beliebigen "NameX"-Property in data, welche ja durch ItemsSource für die Ausgabe referenziert wird, soll die betroffene Zelle (bzw. TextBox) ihre Textfarbe ändern (später). Dies wird hier z.B. durch Click auf das MainWindow ausgelöst.

Wenn also ein Property-Wert von Data sich ändert soll OnPropertyChanged(...) dies an die entsprechende TextBox weiterleiten und dort ein SourceUpdated-Event auslösen (Funktion "x")
wo dann die Farbe geändert werden soll (und andere Sachen passieren)

Meine Frage/Problem:

Wenn der Wert geändert wird (in dem mouseDown-Event) wird dies zwar an die TextBox weiter-
gereicht (Änderung ist sichtbar) aber kein SourceUpdated-Event dort ausgelöst.
Das Problem was ich gefunden habe ist, daß "PropertyChanged" in Data immer null ist wenn
"OnPropertyChanged(...)" aufgerufen wird.

Wo ist mein Denkfehler ?

Vielen Dank für jeden Hinweis bzw. andere Lösungen!

3.170 Beiträge seit 2006
vor 5 Jahren

Hallo,

Das Problem was ich gefunden habe ist, daß "PropertyChanged" in Data immer null ist wenn
"OnPropertyChanged(...)" aufgerufen wird.

Kann ich nicht bestätigen. Der PropertyChanged-Krempel funktioniert wunderbar. Das hab ich gerade ausprobiert.

Dir fehlt in den Textbox-Bindings ein NotifyOnSourceUpdated=True, sonst wird das SourceUpdated-Event nicht ausgeführt.
Im SourceUpdated-Eventhandler (bei dir die Methode mit dem aussagekräftigen Namen "x" reicht dann folgendes:

        private void x(object sender, DataTransferEventArgs e)
        {
            var box = (sender as TextBox);
            if(box != null)
                box.Background = Brushes.Green;
        }

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

W
Wirsing22 Themenstarter:in
2 Beiträge seit 2018
vor 5 Jahren

Danke für die Antwort!

Das Problem für den null-Wert in "PropertyChanged" war, daß ich in meinem eigentlichen Programm
(in mouseDown) noch eine "view.Items.Refresh()" Anweisung hatte bevor ich den Wert geändert habe (diese Zeile hatte ich hier nicht mit aufgeführt da unrelevant).

Desweiteren konnte ich meinen Eventhandler "x" erst durch das TargetUpdated-Event erreichen
(plus NotifyOnTargetUpdated=True natürlich).

Funktioniert jetzt wunderbar!