String Binding Update UI

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von HamburgerJungeJr.

    String Binding Update UI

    Hallo,

    ich habe eine String-Property, die an den DisplayMemberPath eines TabControls gebunden ist.
    Diese Property beinhaltet manchmal einen festen String und manchmal eine Spalte aus einer DataRow.

    Wie kann ich jetzt dafür sorgen, dass sich der Header des TabControl aktualisiert, sobald sich die String-Property ändert?

    VB.NET-Quellcode

    1. // Klasse Fahrzeug
    2. public String DisplayText {
    3. get {
    4. return DataRow.ModellRow.Name; //Modell ist an eine ComboBox gebunden und wenn ein anderer Eintrag ausgewählt wird, soll sich der Header ändern
    5. }
    6. }
    7. //Klasse Hersteller
    8. public String DisplayText {
    9. get {
    10. return "Hersteller";
    11. }
    12. }

    XML-Quellcode

    1. <TabControl Style="{StaticResource tabControlStyle}" ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True" Grid.RowSpan="2" DisplayMemberPath="DisplayText">
    2. <FrameworkElement.Resources>
    3. <DataTemplate DataType="{x:Type vm:Fahrzeug}">
    4. <v:uclFahrzeug />
    5. </DataTemplate>
    6. <DataTemplate DataType="{x:Type vm:Hersteller}">
    7. <v:uclHersteller />
    8. </DataTemplate>


    Ich hoffe ich habe mich verständlich ausgedrückt und ihr könnt mir helfen.

    Gruß
    HamburgerJungeJr

    ErfinderDesRades schrieb:

    Und scheinbar bastelst du da nun DataRow-Wrapper, um die Choose Wpf-Kompatibel zu kriegen, was?

    Ich weiß nicht, was du damit meinst.

    Es geht um das gleiche Projekt wie hier.
    Da ich ja verschiedene Objekte in einem TabControl anzeige, müssen diese ja eine gleiche Property haben, die im Header angezeigt wird. Und das soll nun bei manchen der Inhalt aus der DataRow und bei manchen einfach nur ein String sein.
    Ich habe die Klasse Fahrzeug jetzt so verändert:

    C#-Quellcode

    1. ​class Fahrzeug : Tab{
    2. private HcfData.FahrzeugRow dataRow;
    3. public Fahrzeug(HcfData.FahrzeugRow dataRow) {
    4. this.dataRow = dataRow;
    5. }
    6. public HcfData.FahrzeugRow DataRow {
    7. get {
    8. return dataRow;
    9. }
    10. }
    11. public int ModellId {
    12. get {
    13. return DataRow.ModellId;
    14. }
    15. set {
    16. DataRow.ModellId = value;
    17. NotifyPropertyChanged();
    18. }
    19. }
    20. public override String DisplayText {
    21. get {
    22. return DataRow.ModellRow.Name;
    23. }
    24. }
    25. }


    Klasse Tab:

    C#-Quellcode

    1. public abstract class Tab : INotifyPropertyChanged {
    2. public event PropertyChangedEventHandler PropertyChanged;
    3. public abstract String DisplayText {
    4. get;
    5. }
    6. protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") {
    7. if (PropertyChanged != null) {
    8. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    9. }
    10. }
    11. }


    PropertyChanged wird auch ausgelöst, der Header wird aber immer noch nicht aktualisiert.
    Ich habe auch schon statt DisplayMember probiert den Header mit

    XML-Quellcode

    1. <Setter Property="Header" Value="{Binding DisplayText, UpdateSourceTrigger=PropertyChanged}" />

    zu setzen.
    Ich habe das jetzt so gelöst:

    C#-Quellcode

    1. ​public abstract class Tab : INotifyPropertyChanged {
    2. public event PropertyChangedEventHandler PropertyChanged;
    3. public abstract String DisplayText {
    4. get;
    5. }
    6. protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") {
    7. if (PropertyChanged != null) {
    8. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    9. }
    10. }
    11. protected void NotifyPropertyChanged(String[] propertyName) {
    12. if (PropertyChanged != null) {
    13. foreach (string property in propertyName){
    14. PropertyChanged(this, new PropertyChangedEventArgs(property));
    15. }
    16. }
    17. }
    18. }
    19. class Fahrzeug : Tab{
    20. private HcfData.FahrzeugRow dataRow;
    21. public Fahrzeug(HcfData.FahrzeugRow dataRow) {
    22. this.dataRow = dataRow;
    23. }
    24. public HcfData.FahrzeugRow DataRow {
    25. get {
    26. return dataRow;
    27. }
    28. }
    29. public int ModellId {
    30. get {
    31. return DataRow.ModellId;
    32. }
    33. set {
    34. DataRow.ModellId = value;
    35. NotifyPropertyChanged(new String[] {"ModellId", "DisplayText"});
    36. }
    37. }
    38. public override String DisplayText {
    39. get {
    40. return DataRow.ModellRow.Name;
    41. }
    42. }
    43. }