| 

.NET C# Java Javascript Exception

3
Ich will eine Textbox von der Oberfläche an eine Klasse im codebehind binden.
Leider geht es nicht ich bekomme immer keinen Wert, irgend was muss noch fehlen.
Wäre super wenn jemand helfen könnte, ich mache daran jetzt schon Tage rum ...

1. Ziel sollte die Klasse DataClass sein und der Wert sollte im FieldName gespeichert werden.
public class DataClass : INotifyPropertyChanged
{
private string _FieldName;

public string FieldName
{
get { return _FieldName; }
set
{
if (_FieldName == value) return;
_FieldName = value;
OnPropertyChanged("Text");
}
}

#region Implementation of INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

#endregion


2. Das Binding: (name der Textbox Textbox:txtName_)
Event MainWindow Loaded:

DataAim = new DataClass();

Binding myBinding = new Binding();
myBinding.Path = new PropertyPath("Text");
myBinding.Source = DataAim;
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

txtName_.SetBinding(TextBox.TextProperty, myBinding);

Bin dankbar über jede info!
Danke!
31.07.2013
MatthiasDD 13 1 3
lbm1305 849 1 8
Nutze bitte die Code-Tags mit den eckigen Klammern. Dann lässt sch der Code besser lesen.
lbm1305 31.07.2013
7 Antworten
1
So sollte es gehen:

Die DataClass
private string _firstName;

public string FirstName
{
get { return _firstName; }
set
{
if (value == _firstName)
{
return;
}
_firstName = value;
RaisePropertyChanged("FirstName");
}
}


Das Binding mit der Instanz von DataClass
var binding = new Binding("FirstName")
{
Mode = BindingMode.OneWay,
Source = dataClass,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};

_textBlock1.SetBinding(TextBlock.TextProperty, binding);
// _textBlock1 ist dabei der Name des Elements


EDIT:
Hier der Code für die TextBox:
var binding = new Binding("FirstName")
{
Mode = BindingMode.TwoWay,
Source = dataClass,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};

_txtName.SetBinding(TextBox.TextProperty, binding);
//_txtName ist der Name der TextBox


PS: Falls Die Antwort korrekt war, hake die bitte mit dem grünen Häckchen ab, dann wissen andere mit einer vergleichbaren Frage, dass die Antwort geholfen hat. Dankeschön.
31.07.2013
lbm1305 849 1 8
lbm1305 849 1 8
1
Hallo,

beim kurz überfliegen ist mir nur aufgefallen das du für die Property Fieldname benutzt, aber für den Aufruf "OnPropertyChanged("Text")" Text benutzt. So wird dein Binding nicht gefunden.

Viele Grüße
31.07.2013
Platon 86 3
War bzw. ist bereits die korrekte Antwort.
lbm1305 31.07.2013
1
Der Vollständigkeit halber möchte ich noch hinzufügen, dass eigentlich jegliches Binding-Problem mit Snoop analysiert und nachvollzogen werden kann. Ohne Snoop würd ich manchmal schier verzweifeln.
Auch VisualStudio kann Binding Errors ausgeben, allerdings nur im Output-Window und nur als Text. Dazu muss man in den Optionen die WPF Debugging Ausgaben aktivieren bzw. gesprächiger einstellen.
31.07.2013
ffordermaier 8,4k 3 9
0
Danke erst mal, ich habe es raus genommen, leider bekomme ich immer noch kein Wert in FieldName.
31.07.2013
MatthiasDD 13 1 3
0
Gibt es einen bestimmten Grund, dass Du das Binding über Code machst und nicht über XAML-Anweisungen?
Ich habe selber noch kein Binding via Code gemacht, aber der Path sollte einen Verweis auf das Feld in der DataClass sein, sprich "FieldName". In der Doku von PropertyPath ist angegeben, dass der Konstruktor als erstes die Parameter erwartet und erst als zweites den Pfadnamen.
31.07.2013
Roland Bär 338 6
0
Leider geht es noch nicht , das setzten des Wertes oder das zurückschreiben
funktioniert nicht. Ich habe hier nochmal den aktuellen Code:

public class DataClass : INotifyPropertyChanged
{
private string _FieldName;
public string FieldName
{
get { return _FieldName; }
set
{
if (value == _FieldName)
{
return;
}
_FieldName = value;

OnPropertyChanged("FieldName");
}
}

#region Implementation of INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

#endregion
}


DataAim = new DataClass();

var binding = new Binding("FieldName")
{
Mode = BindingMode.TwoWay,
Source = DataAim,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};

txtName_.SetBinding(TextBlock.TextProperty, binding);
31.07.2013
MatthiasDD 13 1 3
Um was handelt es sich bei txtName_? Der Name einer TextBox? Oder warum steht in "SetBinding" TextBlock.TextProperty"?
lbm1305 31.07.2013
Ich habe mein Post mit dem Code erweitert.
lbm1305 31.07.2013
Ich sehe gerade die Antwort von Platon. Er / Sie hat bereits die richtige Antort gepostet. Im Grunde genommen, war einfach der Bezeichner falsch. Statt "Text" muss da der Name des Properties rein "FieldName"
lbm1305 31.07.2013
0
Vielen Dank für eure Hilfe!

Ein sehr guter Hinweiß war "TextBlock.TextProperty" und ich wollte eine TextBox auslesen ....
Danke auch für alle anderen Hinweise!
31.07.2013
MatthiasDD 13 1 3
Streng genommen ist der Fehler erst später hinzugekommen. In Deiner Originalfrage stand es noch korrekt drin.
Jens Duczmal 31.07.2013

Stelle deine .net-Frage jetzt!