Laden...

TextBox Text

Erstellt von Kuehner vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.647 Views
K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 16 Jahren
TextBox Text

Hallo,

Ich habe in WPF eine TextBox erstellt (IsReadOnly = "false") und mit Binding einem Property zugeordnet.

Der Benutzer "könnte" nun in diesem Fall Text eingeben. Dieser Text wird auch immer richtig an das Property übergeben. Leider nicht andersrum. Wenn sich das Property ändert (und ich das OnPropertyChange sende) ändert sich in der TextBox nichts. Der Tool tip (gleiches Property) wird jedoch richtig angezeigt.

An was kann das liegen??

C
980 Beiträge seit 2003
vor 16 Jahren

Kannst du den Code des Property Setters zeigen (der das Eregnis von INotifyPropertyChanged auslöst)?

edit: und die Bindings

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 16 Jahren

Gerne:


		string deviceName = "";

		public string DeviceName
		{
			get
			{
				return deviceName;
			}
			set
			{
				if (deviceName != value)
				{
					if ((group as BaseGroup).CheckMe(this, "DeviceName", value))
					{
						deviceName = value;
						Description = "Device " + deviceName;
					}
					else
					{
						MessageBox.Show("Device name already exists", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
					}
					OnPropertyChange("DeviceName");
				}
			}
		}

und hier das Binding:


        <TextBox ToolTip="{Binding Path=DeviceName}" Text="{Binding Path=DeviceName}" HorizontalAlignment="Left" Margin="22,4,0,0" VerticalAlignment="Top" Width="Auto" Height="21.96" TextWrapping="Wrap" Background="{x:Null}" BorderBrush="{x:Null}" Panel.ZIndex="1" x:Name="txtId"  FontSize="14" FontWeight="Bold" IsEnabled="True" Focusable="True" AcceptsReturn="False"/>

Vielleicht hilft's ja weiter.

Meine Alternativ-Lösung bis jetzt: DataContext auf null setzen und dann wieder auf den alten Wert... dann geht's (so eine Art Refresh).

Danke mal!

129 Beiträge seit 2007
vor 16 Jahren

Servus,

vielleicht solltest du dir in der MSDN mal den Abschnitt Propertys ansehen.

Aber versuch mal das hier 😁

private string  pDeviceName = "";

        public string DeviceName
        {
            get
            {
                return pDeviceName;
            }
            set
            {
                pDeviceName = value;
            }
        }


        private void MachWas()
        {

            if (deviceName != value)
            {
                if ((group as BaseGroup).CheckMe(this, "DeviceName", value))
                {
                    deviceName = value;
                    Description = "Device " + deviceName;
                }
                else
                {
                    MessageBox.Show("Device name already exists", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                OnPropertyChange("DeviceName");
            }
        }

MfG
Siggi

C
980 Beiträge seit 2003
vor 16 Jahren

Nein, dein Ansatz (Kuehner) war schon richtig, die Notification soll unbedingt im Property Setter stehen. Aber was ist das für ne OnPropertyChange Methode?

Eine Lösung die funktioniert sieht etwa so aus (ohne Garantie, ist direkt hier so hingeschrieben):


public class MyObjectView : INotifyPropertyChanged
{
    private string _deviceName;

    public event PropertyChangedEventHandler PropertyChanged;

    public string DeviceName
    {
        get { return _deviceName; }
        set
        {
            if(value != _deviceName)
            {
                _deviceName = value;
                RaisePropertyChanged("DeviceName");
            }
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if(handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}


Müsste dann funktionieren. Sauberkeitshalber würde ich beim ToolTip Binding noch ", Mode=OneWay" und beim Text Binding ", Mode=TwoWay" ergänzen.