Autor Beitrag
Red
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 16.06.15 15:21 
Frage vom Neuling an die Erfahrenen:
Ich lese aus einer DB einen Wert und zeige ihn als Content in einem Button an. Das funktioniert!
Nun klicke ich auf den Button und aus einer anderen DB-Tabelle soll die nächste Nummer angezeigt werden.
Im Debug wird mir die korrekte Zuweisung angezeigt. Im Button bleibt aber der alte Wert, als würde ein Refresh fehlen.
Dass es beim Start funktioniert zeigt doch das korrekte Binding?!

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
    <Grid Name="myGrid">
                <Grid Background="#FFE5E5E5">
                    <StackPanel HorizontalAlignment="Left" Height="35" Margin="2,2,0,0" VerticalAlignment="Top" Orientation="Horizontal">
                        <TextBlock Margin="0,4" FontSize="20" Text="Buchnummer"/>
                        <Button x:Name="btnABBUCH" Margin="4,0,0,0" Width="60" Content="{Binding Path=ABBUCH}" Click="btnABBUCH_Click" Template="{DynamicResource ButtonTemplateBuchnummer}" Style="{StaticResource ButtonBuchnummerStyle}"/>
                    </StackPanel>
               </Grid>
    </Grid>



ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
namespace Buchnummer
{
    public partial class MainWindow : Window
    {

        private dsBuchnummer myBuchnummer = new dsBuchnummer();

        public MainWindow()
        {
            InitializeComponent();
            prcBuchnummer();
        }

        private void Confirm_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            myBuchnummer = new dsBuchnummer();
            myGrid.DataContext = myBuchnummer;
            e.Handled = true;
        }

        private void prcBuchnummer()
        {
                myGrid.DataContext = myBuchnummer;
                myBuchnummer.ABBUCH = "123";
            }
        }

        //Vergabe der nächsten Buchnummer
        private void btnABBUCH_Click(object sender, RoutedEventArgs e)
        {
            myBuchnummer.ABBUCH = "12345";
        }
    }

    public class dsBuchnummer : IDataErrorInfo
    {
        public string ABBUCH { get; set; }

        public string Error
        {
            get { throw new NotImplementedException(); }
        }

        public string this[string columnName]
        {
            get
            {
                string result = null;
                int intNummer = 0;

                if (columnName == "ABBUCH")
                {
                }

                else if (1==1)
                {
                }

                return result;
            }
        }
    }
}

Moderiert von user profile iconChristian S.: XML-Tags hinzugefügt
Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 16.06.15 16:10 
Hallo und :welcome:

deine Klasse (bzw. die Eigenschaft) muß die INotifyPropertyChanged-Schnittstelle unterstützen, damit sich die Anzeige (automatisch) aktualisiert, s. z.B. Implementing INotifyPropertyChanged.

Mittelfristig solltest du bei WPF aber WPF Apps With The Model-View-ViewModel Design Pattern (MVVM) einsetzen, d.h. möglichst kein Code-Behind, sondern nur per ViewModel die Daten an die View binden. Und für Aktionen (z.B. einen Button-Klick) dann die ICommand-Schnittstelle (z.B. per RelayCommand) verwenden.
Red Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 17.06.15 08:07 
Hallo Th69,

danke zunächst für die Unterstützung. Der Artikel ist soweit einleuchtend. Nach meinem Verständnis werden die Daten in die Steuerelemente einmalig vor der Anzeige (nennt man wohl rendern) einkopiert. Eine permanente Bindung zu den Daten im Code-Behind muss explizit definiert werden.

Leider schaffe ich es nicht den Bogen zu schlagen von dem Beispiel zu meinem Programm.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.06.15 09:24 
Du wirst es doch schaffen, deine Klasse dsBuchnummer so zu erweitern wie im Artikel angegeben, d.h. das Ereignis PropertyChanged sowie die Methode OnPropertyChanged daraus zu kopieren und dann bei deiner Eigenschaft im Setter diese dann aufzurufen.

PS: Klassen, Methoden u. Eigenschaften sollten in C# mit einem Großbuchstaben anfangen (laut Naming Guidelines).
Red Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 17.06.15 12:04 
Danke für deine Zuversicht. Es läuft jetzt tatsächlich.

Warum brauch ist "public ObservableCollection<Customer> CustomerList" nicht?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.06.15 15:19 
Eine ObservableCollection<T> brauchst du nur, wenn du eine Liste darstellen (und bearbeiten) willst, denn diese implementiert schon sowohl die INotifyPropertyChanged- als auch die INotifyCollectionChanged-Schnittstelle.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 17.06.15 15:44 
Zitat:
Eine ObservableCollection<T> brauchst du nur, wenn du eine Liste darstellen (und bearbeiten) willst, denn diese implementiert schon sowohl die INotifyPropertyChanged-

Ich sollte eigentlich besser die Schnauze halten, Information Overload und so (sorry @Red) , kann ich aber nicht ;)

Bei einer generischen Liste muß natürlich primär der enthaltene generische Typ INotifyPropertyChanged implementieren nicht die Liste. Die Liste macht es selbst auch aber nur dafür falls es selber gebunden wird für seine eigenen Properties. Also z.B wenn man eine ObservableCollection<ObservableCollection<string>> hat damit man bei der inneren Liste an dessen Count binden kann und mitbekommt wenn die sich ändert. Für komplexes DataBinding ist eigentlich nur INotifyCollectionChanged für die Liste relevant und INotifyPropertyChanged für die enthaltenen Objekte.
Red Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 17.06.15 18:02 
Hier kann ich nicht zustimmen. Ich bin grundsätzlich für jeden Rat zunächst empfänglich.
Diesem Stoff kann ich allerdings mit meinem derzeitigen Wissensstand nicht folgen. Ich bin froh, dass meine Hürde zunächst genommen ist. Tappse dann mal weiter ...

nochmals herzlichen Dank