Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVVM (Visual Basic) - Combobox aktualisiert sich nicht?
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

MVVM (Visual Basic) - Combobox aktualisiert sich nicht?

beantworten | zitieren | melden

Servus in die Runde..

Eventuell kann mir jemand fix weiterhelfen ich versuche eine Combobox Eingabe zu verändern.

Beim Laden (Inhalt) der Combobox funktioniert seltsamerweise alles einwandfrei.

Beispiel :

Property im ViewModel :


    Public Property Lieferschein_Text As String
        Get
            Return _Lieferschein_Text
        End Get
        Set(value As String)
            _Lieferschein_Text = value
            PropertyChange("Lieferschein_Text")
        End Set
    End Property

Ladevorgang :


If Not IsDBNull(DataRow.Item("Lieferschein")) Then ViewModel.Lieferschein_Text = DataRow.Item("Lieferschein")

Lieferschein Inhalt wird korrekt angezeigt.

ViewModel_PropertyChanged Event :


Case "Lieferschein_Text"

                    If ViewModel.Lieferschein_Text = "A" Then

                        ViewModel.Lieferschein_Text = ""

                    End If

Funktioniert nicht der Inhalt bleibt beim A

Kann mir jemand weiterhelfen?

Grüße
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2350

beantworten | zitieren | melden

Hast du denn schon mal mit dem Debugger geprüft, ob der Code überhaupt angesprochen wird?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Hallo inflames2k!

Ja, hab ich und er wird auch durchlaufen.

Edit: in der Property steht dann auch der neue Wert drinne, aber die ComboBox hat immer noch den alten Wert.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

wie sieht denn das Binding aus?

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

                        
<ComboBox Margin="1" IsEditable="True" ItemsSource="{Binding Lieferschein, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Lieferschein" SelectedIndex="{Binding Lieferschein_SelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Lieferschein_Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled}" IsTextSearchEnabled="False" IsSynchronizedWithCurrentItem="True">

                                    <ComboBox.ItemsPanel>

                                        <ItemsPanelTemplate>

                                            <VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"/>

                                        </ItemsPanelTemplate>

                                    </ComboBox.ItemsPanel>

                                </ComboBox>

 


Ich hab auch schon versucht die ItemSource zu aktualisieren (klappt auch) und den SelectedIndex auf den Eintrag zu wechseln, trotzdem bleibt in dem Fall (alles via Quellcode) der Inhalt veraltet.

Grüße

Edit : IsSynchronizedWithCurrentItem="True" hab ich gestern erst beim rumprobieren hinzugefügt.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Jemand eine Idee?
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Es scheint so .. das er die Ansicht nicht ändert wenn man die Variable im PropertyChanged Event verändern möchte, wenn ich das ganze über einen extra Button steuer .. funktioniert es.

Jemand eine Idee warum?
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Wann genau änderst du denn jetzt den Wert?
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

das hatte ich gar nicht gesehen, dass das im PropertyChanged passiert...
Ich denke das passiert, weil Du die selbe Property während ihres Changed-Events nochmal änderst, wird diese Änderung aus Sicherheitsgründen ignoriert (habe mir den Code von .NET diesbezügl. noch nicht angeschaut). Sonst könntest Du da z.B. leicht eine Endlosschleife aus PropertyChanged-Events bauen.

Warum wiollst Du das eigentlich im PropertyChanged überprüfen, und nicht direkt im Setter? Dann könnte sowas nicht passieren...

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Ich probiere es aktuell im PropertyChanged Event an dieser Stelle :

                Case "Lieferschein_Text"

                    ViewModel.Kundennummer_Value = ViewModel.Kundennummer_Text
                    ViewModel.Lieferschein_Value = ViewModel.Lieferschein_Text

                    ' --- Bereinigung --- '

                    ViewModel.Lieferschein_Datum = ""

                    ' --- Individuelle Eingabe --- '

                    set_ComboBox_Kundennummer_Lieferschein()

                    If ViewModel.Lieferschein_Text = "A" Then

                        ViewModel.Lieferschein_Text = "Ohne"

                    End If

Im Setter hatte ich es schon versucht und eben auch noch einmal .. hatte auch nicht funktioniert.

    Public Property Lieferschein_Text As String
        Get
            Return _Lieferschein_Text
        End Get
        Set(value As String)

            If value = "A" Then

                value = "B"

            End If

            _Lieferschein_Text = value
            PropertyChange("Lieferschein_Text")
        End Set
    End Property
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Zeig bitte das ViewModel mit allen Eigenschaften die an der ComboBox gebunden sind.
private Nachricht | Beiträge des Benutzers
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 58
Herkunft: Süddeutschland

beantworten | zitieren | melden

= und == sind nicht dasselbe! In einer if-Anweisung musst du == verwenden zum vergleichen.
OO gibts seit Platon - hatte der auch C#?
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

@CWolle

Aber nicht in VB.net
private Nachricht | Beiträge des Benutzers
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 58
Herkunft: Süddeutschland

beantworten | zitieren | melden

ich bin doch in einem C#-Forum, oder?
Das Code-Fenster ist auch mit 'C#-Code' beschriftet! Versteh ich irgendwas falsch?
OO gibts seit Platon - hatte der auch C#?
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Also für mich ist das VB.NET Code

    Public Property Lieferschein_Text As String
        Get
            Return _Lieferschein_Text
        End Get
        Set(value As String)

            If value = "A" Then

                value = "B"

            End If

            _Lieferschein_Text = value
            PropertyChange("Lieferschein_Text")
        End Set
    End Property
private Nachricht | Beiträge des Benutzers

Moderationshinweis von gfoidl (24.06.2017 - 16:32:46):

Genau, daher braucht das auch nicht weiter vertieft werden.

_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Hallo Sir Rufo!

Sorry für die späte Antwort hatte leider kaum Rechnerzugang am Wochenende.

Hier mal das ViewModel mit allen Eigenschaften die an diese ComboBox gebunden sind :


    Public Property Lieferschein As System.Data.DataTable
        Get
            Return _Lieferschein
        End Get
        Set(value As System.Data.DataTable)
            _Lieferschein = value
            PropertyChange("Lieferschein")
        End Set
    End Property

    Public Property Lieferschein_SelectedIndex As Integer
        Get
            Return _Lieferschein_SelectedIndex
        End Get
        Set(value As Integer)
            _Lieferschein_SelectedIndex = value
            PropertyChange("Lieferschein_SelectedIndex")
        End Set
    End Property

    Public Property Lieferschein_Text As String
        Get
            Return _Lieferschein_Text
        End Get
        Set(value As String)
            _Lieferschein_Text = value
            PropertyChange("Lieferschein_Text")
        End Set
    End Property


Hab jetzt mal den Code nochmal als nicht C# Code gekennzeichnet ... Sorry!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Hab jetzt mal die PropertyChangedCallback Funktion versucht, er setzt zwar den Wert korrekt, aber der ComboBox Inhalt verändert sich halt einfach nicht, als wenn die sich nicht aktualsieren möchte..
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Was du aktuell machst ist in die Eingabe des Benutzers einzugreifen.

Das Control bekommt auf einer Eigenschaft einen geänderten Wert zugewiesen und ruft die Bindings-Logik auf. Während dessen werden allerdings Änderungen an dieser Eigenschaft nicht angenommen weil es sonst zu unendlich rekursiven Aufrufen kommen könnte.

Der Eingriff muss also vor oder nach dem Aufruf des Bindings erfolgen.

Vor dem Binding kommt man z.B. über eine AttachedProperty an das Control.
Nach dem Binding erreicht man durch das Starten eines Tasks.

Ich würde mich hier wohl für eine AttachedProperty entscheiden.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Hast du denn ein Beispiel dazu? Bzw. hast du das in der Richtung schon mal gemacht und weißt das es so funktionieren würde?
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Nicht mit einer ComboBox aber z.B. habe ich damit einer TextBox beigebracht nur Zahlen zu akzeptieren. Dort greift man auch in die Benutzereingabe ein.

Über die AttachedProperty kann man Logik aus dem ViewModel mit dem Control verbinden ohne dass beide sich kennen müssen und genau das willst du ja hier wohl auch machen.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5967
Herkunft: Leipzig

beantworten | zitieren | melden

Also ich verstehe die Anforderungen so, daß der Anzeigetext eines Objektes in Abhängigkeit von anderen Eigenschaften gesetzt werden soll.
Das wäre dann Aufgabe des Models bzw. des ViewModels. Aber nicht der View.

Aber das Problem bzw. die Unklarheit fängt schon bei der Deklaration der ComboBox-Eigenschaften an:
                        
<ComboBox Margin="1" IsEditable="True" ItemsSource="{Binding Lieferschein, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Lieferschein" SelectedIndex="{Binding Lieferschein_SelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Lieferschein_Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled}" IsTextSearchEnabled="False" IsSynchronizedWithCurrentItem="True">


Warum wird bspw. der DisplayMemberPath auf die Eigenschaft gesetzt, die auch gleichzeitig die ItemsSource ist?

Mir ist wirklich nicht klar, was genau die konkreten Anforderungen sind. Aber die Definition der ComboBox ergibt wirklich keinen Sinn.

Beispiele für die Bindung an ItemsControls/ListViews/ComboBoxen gibt es in [Artikel] MVVM und DataBinding
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Die Items in ItemsSource haben eine Eigenschaft mit dem Namen Lieferschein. Ist also völlig ok.

IsEditable auf true lässt erwarten, dass hier bei der ComboBox eine freie Eingabe zugelassen werden soll wie bei einer TextBox.

Unsinnig - im Sinne von überflüssig - ist das Binden der ItemsSource mit TwoWay und PropertyChanged. Frisst aber auch kein Brot.

Natürlich ist es Aufgabe des ViewModels die Logik bereitzustellen wenn diese von anderen Eigenschaften im ViewModel abhängig ist, aber aufgrund des Timings muss man entweder in das Control selber eingreifen oder einen asynchronen Aufruf tätigen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Das klingt so als wenn das Sinn macht mit dem AttachedProperty.. konnte aber bis jetzt noch keinen Erfolg verbuchen.
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Hier mal eine Lösung in C#

Definition der AttachedProperty
(wer sich an der Begrifflichkeit Behavior stört, ersetze das bitte in Gedanken durch EgonKarlSeineFrauIhreGedöns)


using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace mc119350.WpfApp.Behavior
{
    public interface ITextInterception
    {
        bool ShouldChangeText(string value, out string newValue);
    }

    public static class ComboBoxInterceptor
    {
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextInterceptionProperty =
            DependencyProperty.RegisterAttached(
                "TextInterception",
                typeof(ITextInterception),
                typeof(ComboBoxInterceptor),
                new PropertyMetadata(null, TextInterceptionChanged));

        public static void SetTextInterception(ComboBox obj, ITextInterception value)
        {
            obj.SetValue(TextInterceptionProperty, value);
        }

        public static ITextInterception GetTextInterception(ComboBox obj)
        {
            return obj.GetValue(TextInterceptionProperty) as ITextInterception;
        }

        static void TextInterceptionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var obj = d as ComboBox;
            if (e.OldValue == null && e.NewValue != null)
            {
                obj.PreviewTextInput += ComboBox_PreviewTextInput;
            }
            if (e.OldValue != null && e.NewValue == null)
            {
                obj.PreviewTextInput -= ComboBox_PreviewTextInput;
            }
        }

        static void ComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            var obj = sender as ComboBox;
            var interceptor = GetTextInterception(obj);
            string newText;
            if (interceptor.ShouldChangeText(e.Text,out newText))
            {
                e.Handled = true;
                obj.Text = newText;
            }
        }

    }
}
Hier das ViewModel


using GalaSoft.MvvmLight;
using mc119350.WpfApp.Behavior;
using System.Collections.ObjectModel;

namespace mc119350.WpfApp.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public MainViewModel()
        {
            Lieferschein = new ObservableCollection<LieferscheinViewModel>(
                new System.Collections.Generic.List<LieferscheinViewModel>
                {
                    new LieferscheinViewModel{ Lieferschein = "1234" },
                    new LieferscheinViewModel{ Lieferschein = "12345" },
                    new LieferscheinViewModel{ Lieferschein = "123456" },
                }
            );

            TextInterception = new TextInterceptionImpl();
        }

        class TextInterceptionImpl : ITextInterception
        {
            public bool ShouldChangeText(string value, out string newValue)
            {
                if (value == "A")
                {
                    newValue = "B";
                    return true;
                }
                newValue = string.Empty;
                return false;
            }
        }

        ObservableCollection<LieferscheinViewModel> _lieferschein;
        string _lieferschein_Text;
        int _lieferschein_SelectedIndex;
        bool _isEnabled = true;
        ITextInterception _textInterception;

        public ITextInterception TextInterception
        {
            get => _textInterception;
            set => Set(ref _textInterception, value);
        }

        public ObservableCollection<LieferscheinViewModel> Lieferschein
        {
            get => _lieferschein;
            set => Set(ref _lieferschein, value);
        }

        public string Lieferschein_Text
        {
            get => _lieferschein_Text;
            set => Set(ref _lieferschein_Text, value);
        }
        public int Lieferschein_SelectedIndex
        {
            get => _lieferschein_SelectedIndex;
            set => Set(ref _lieferschein_SelectedIndex, value);

        }
        public bool IsEnabled
        {
            get => _isEnabled;
            set => Set(ref _isEnabled, value);
        }

    }

    public class LieferscheinViewModel : ViewModelBase
    {
        string _lieferschein;

        public string Lieferschein { get => _lieferschein; set => Set(ref _lieferschein, value); }

    }
}
und zu guter letzt die View

<Window x:Class="mc119350.WpfApp.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:behavior="clr-namespace:mc119350.WpfApp.Behavior"
        xmlns:local="clr-namespace:mc119350.WpfApp"
        mc:Ignorable="d"
        DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ComboBox Grid.Row="0"
            behavior:ComboBoxInterceptor.TextInterception="{Binding TextInterception}"
            ItemsSource="{Binding Lieferschein}" 
            DisplayMemberPath="Lieferschein" 
            SelectedIndex="{Binding Lieferschein_SelectedIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
            Text="{Binding Lieferschein_Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
            IsEnabled="{Binding IsEnabled}"
            IsTextSearchEnabled="True" 
            IsEditable="True"
            Margin="1"/>
    </Grid>
</Window>
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat von _Cashisclay
Im Setter hatte ich es schon versucht und eben auch noch einmal .. hatte auch nicht funktioniert.
Das kommt mir seltsam vor...
Ich muss jetzt doch mal nachfragen: Bist Du sicher, dass Dein VM auch tatsächlich INotifyPropertyChanged implementiert, oder nur das PropertyChanged-Event zur Verfügung stellt?

Gruß, MarsStein
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Zitat von MarsStein
Zitat von _Cashisclay
Im Setter hatte ich es schon versucht und eben auch noch einmal .. hatte auch nicht funktioniert.
Das kommt mir seltsam vor...
Probier es einfach mal aus
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Also so richtig krieg ich es nicht hin ..

Woher soll denn TextInterception wissen wann sich der Lieferschein_Text ändert?
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Ich bin natürlich davon ausgegangen, dass du immer noch das erreichen möchtest:
Zitat
ich versuche eine Combobox Eingabe zu verändern
Und genau da setze ich an: Bei der Eingabe in der ComboBox.

Wenn dem nicht mehr so ist, dann musst du das nochmal genauer spezifizieren.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Möchte ich auch allerdings verändert sich in meiner TextInterception Property nichts bei dem Binding..
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Aus meiner Sicht brauch ich doch nur das um zu prüfen ob ich die Eingabe im Vorfeld verändern kann :
Zitat von Sir Rufo
Hier mal eine Lösung in C#

Definition der AttachedProperty
(wer sich an der Begrifflichkeit Behavior stört, ersetze das bitte in Gedanken durch EgonKarlSeineFrauIhreGedöns)


using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace mc119350.WpfApp.Behavior
{
    public interface ITextInterception
    {
        bool ShouldChangeText(string value, out string newValue);
    }

    public static class ComboBoxInterceptor
    {
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextInterceptionProperty =
            DependencyProperty.RegisterAttached(
                "TextInterception",
                typeof(ITextInterception),
                typeof(ComboBoxInterceptor),
                new PropertyMetadata(null, TextInterceptionChanged));

        public static void SetTextInterception(ComboBox obj, ITextInterception value)
        {
            obj.SetValue(TextInterceptionProperty, value);
        }

        public static ITextInterception GetTextInterception(ComboBox obj)
        {
            return obj.GetValue(TextInterceptionProperty) as ITextInterception;
        }

        static void TextInterceptionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var obj = d as ComboBox;
            if (e.OldValue == null && e.NewValue != null)
            {
                obj.PreviewTextInput += ComboBox_PreviewTextInput;
            }
            if (e.OldValue != null && e.NewValue == null)
            {
                obj.PreviewTextInput -= ComboBox_PreviewTextInput;
            }
        }

        static void ComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            var obj = sender as ComboBox;
            var interceptor = GetTextInterception(obj);
            string newText;
            if (interceptor.ShouldChangeText(e.Text,out newText))
            {
                e.Handled = true;
                obj.Text = newText;
            }
        }

    }
}
Hier das ViewModel


using GalaSoft.MvvmLight;
using mc119350.WpfApp.Behavior;
using System.Collections.ObjectModel;

namespace mc119350.WpfApp.ViewModel
{
    public class MainViewModel
    {
        public MainViewModel()
        {
            TextInterception = new TextInterceptionImpl();
        }

        class TextInterceptionImpl : ITextInterception
        {
            public bool ShouldChangeText(string value, out string newValue)
            {
                if (value == "A")
                {
                    newValue = "B";
                    return true;
                }
                newValue = string.Empty;
                return false;
            }
        }

        string _lieferschein_Text;
        ITextInterception _textInterception;

        public ITextInterception TextInterception
        {
            get => _textInterception;
            set => Set(ref _textInterception, value);
        }

        public string Lieferschein_Text
        {
            get => _lieferschein_Text;
            set => Set(ref _lieferschein_Text, value);
        }

    }

}
und zu guter letzt die View

<Window x:Class="mc119350.WpfApp.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:behavior="clr-namespace:mc119350.WpfApp.Behavior"
        xmlns:local="clr-namespace:mc119350.WpfApp"
        mc:Ignorable="d"
        DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ComboBox Grid.Row="0"
            behavior:ComboBoxInterceptor.TextInterception="{Binding TextInterception}"
            Text="{Binding Lieferschein_Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
            IsEditable="True"
            Margin="1"/>
    </Grid>
</Window>

Und das habe ich auch versucht so in VB.net umzusetzen..
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers