| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich habe eine Klasse die INotifyPropertyChanged implementiert. Diese Klasse hat ein paar String Properties. Ich möchte nun ein Objekt an ein Grid mit mehreren Textboxen binden. Der Mode sollte OneWayToSource sein. (um Benutzereingaben im Objekt zu speichern)

Wie mache ich das nun am besten? In den Beispielen finde ich eigentlich immer nur eine Eigenschaft an eine Textbox gebunden. Muss ich da für jede Property eine eigene Bindung erstellen, oder kann ich im XAML z. B. nur den Pfad angeben, den Rest aber im Code Behind erledigen?
<Grid>
...
<TextBox Name="textBoxMethod" Text="{Binding Path=Method}" />
<TextBox Name="textBoxBarcode" Text="{Binding Path=Barcode}" />
...
</Grid>


Danke,
Mike
01.06.2011
Xantiva 2,3k 2 9
3 Antworten
3
Hallo Mike,

Datenbindung ist nicht auf ein Target pro Source beschränkt, da ist es egal welchen Mode du nimmst. Wenn du aber OneWayToSource verwendest werden die beiden TextBoxen nicht "synchronisiert" sein, d.h. wenn du etwas in die eine TextBox eingibst wird der Wert zur Source übertragen werden, von der Source aber nicht mehr zum 2ten Target. Ebenfalls wird kein Initialer Wert an das Target übertragen. Aber das scheinst du ja so zu wollen.

Beispiel:
XAML:
<Window x:Class="OneWayToSource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel VerticalAlignment="Center">
<TextBox Text="{Binding BindingSource, Mode=OneWayToSource}" Width="Auto" Height="30" Margin="5"/>
<TextBox Text="{Binding BindingSource, Mode=OneWayToSource}" Width="Auto" Height="30" Margin="5"/>
</StackPanel>
</Grid>
</Window>

CodeBehind:
public partial class MainWindow : Window
{
private ViewModel model;
public MainWindow()
{
InitializeComponent();
model = new ViewModel();
model.PropertyChanged += OnVMPropertyChanged;
DataContext = model;
}

private void OnVMPropertyChanged(object sender, PropertyChangedEventArgs e)
{
MessageBox.Show("PropertyChanged to '" + model.BindingSource + "'");
}
}


ViewModel:
using System.ComponentModel;

namespace OneWayToSource
{
public class ViewModel : INotifyPropertyChanged
{
private string source;
public string BindingSource
{
get { return source; }
set { source = value; InvokePropertyChanged("BindingSource"); }
}

public ViewModel()
{
source = "foobar";
}

#region Implementation of INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

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

#endregion
}
}
01.06.2011
Sparky 109 3
0
Hallo,

Codebehing wäre möglich, aber es ist wohl ein Umweg wenn es in XAML schön deklarativ erledigt werden kann. Für jede Textbox muss die Texteigenschaft separt gebunden werden an die entsprechende Eigenschaft des gebundenen Objekts - wie soll es denn sonst wissen was es anzeigen soll?

Es ist jedoch möglich die Textboxen in eine UserControl zu packen und somit hast du eine wiederverwendbares Teil - lohnt sich aber nur wenn dieselbe Konstellation öfters benötigt wird.

mfG Gü
01.06.2011
gfoidl 9,4k 3 5
Du hast recht - man könnte die Frage auch andersherum gestellt ansehen. Daran habe ich gar nicht gedacht, da es irgendwie so klar ist, dass jede TextBox ihr Binding separat deklarieren muss. Wäre interessant was "der Rest", den man im CodeBehind bearbeiten könnte so beinhaltet.
Sparky 01.06.2011
Ich hab daran gedacht weil ich viel mit Anfängern (ist gegenüber niemanden böse gemeint) zu tun habe ;-)
gfoidl 01.06.2011
0
Danke für Eure Antworten.
@Sparky: Dein Beispiel hat mir noch mal deutlich gemacht, dass ich ja eigentlich schon im MVVM Pattern stecke (ohne es richtig mitbekommen zu haben :( ).

@gfoidl: "weil ich viel mit Anfängern (ist gegenüber niemanden böse gemeint) zu tun habe ;-)"
Hier kann niemand böse werden ;) In dem Punkt sehe ich mich hierbei auf jeden Fall noch auf so einem Niveau. ;)

Was habe ich nun gemacht? Eine Mischung aus Beidem:
<Grid Name="gridSendData">
...
<TextBox Name="textBoxMethod" Text="{Binding Path=Method}" />
<TextBox Name="textBoxBarcode" Text="{Binding Path=Barcode}" />
...
</Grid>


Und dann mein Objekt dem DataContext des Grid zugewiesen:
m_SendData = new SendData();
m_SendData.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(m_SendData_PropertyChanged);
gridSendData.DataContext = m_SendData;


Im XAML reicht dann die Angabe des Binding Path aus.

Danke,
Mike
01.06.2011
Xantiva 2,3k 2 9
Schön dass das Bsp weitergeholfen hat - dein Beispiel ist aber nicht OneWayToSource... So wird per default in beide Richtungen gebunden. OneWayToSource macht sowieso fast nie Sinn, ich kann mich an irgendein Beispiel von Bea Costa entsinnen, wo das mal Sinn machte, aber sonst...
Sparky 01.06.2011
Hm, habe ich gerade auch bemerkt. Nicht so wild, hauptsache der Rest funktioniert erst mal.
Xantiva 01.06.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH