Hallo Leute,
ich habe in verschiedenen TreeView-Elementen dazugehörige DataGrids. Wenn der Benutzer nun eine Reihe aus einem beliebigen DataGrid anwählt, so möchte ich, dass das SelectedItem an andere Controls (Textboxen) gebunden wird. Das klappt aber leider nur beim Selektieren der ersten DataGrid.
Ich habe die Frage zuvor auch schon auf StackOverflow gestellt, wobei ich bisher allerdings noch auf keine Lösung gekommen bin.
Das TreeView mit samt deren DataGrid wird wie folgt dargestellt und gebunden:
[highlight=c#]
<TreeView ItemsSource="{Binding Path=PlaceList}">
<TreeView.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding Path=Name}">
<DataGrid ItemsSource="{Binding MachinesInPlace, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedMachine, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</TreeViewItem>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
[/highlight]
Die Textboxen, die die selektierte Eigenschaft abgreifen sollen, funktionieren wie folgt:
[highlight=c#]
<TextBox Text="{Binding PlaceList/SelectedMachine.Id, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
[/highlight]
Ich arbeite mit dem MvvmLight-Framework. Innerhalb des ViewModels habe ich eine ObservableCollection mit Places angelegt. An diese ist die TreeView gebunden.
[highlight=c#]
public ObservableCollection<PlaceModel> PlaceList { get; set; } = new ObservableCollection<PlaceModel>();
[/highlight]
Das PlaceModel an sich beinhaltet dann noch eine Maschinen-Liste, die angibt, welche Maschinen im Platz vorhanden sind. Außerdem ist dort die selektierte Maschine enthalten.
[highlight=c#]
public class PlaceModel
{
public int Id { get; set; }
public string Name { get; set; } = "_CurrentObjectName";
public ObservableCollection<MachineModel> MachinesInPlace { get; set; }
public MachineModel SelectedMachine { get; set; }
}
[/highlight]
Jetzt besteht der Fehler, dass die Textbox nur die Items aus dem ersten Datagrid annimmt. Jedes nachfolgende Datagrid wird ignoriert.
Meine Idee wäre es jetzt innerhalb des ViewModels die Eigenschaft SelectedMachine anzulegen. Würde mMn. auch mehr Sinn machen, als dies in jedem Platz-Modell zu tun. Das Problem ist dann das zwar die Textbox auf die Property aus dem ViewModel zugreifen kann, ich aber nicht mehr das SelectedItem-Property der DataGrid daran binden kann. Das SelectedItem-Property kann ich glaube ich nur an Eigenschaften aus der zuvor gebundenen PlatzListe (PlaceList) binden.
Falls sich das Problem genauer anschauen möchte, habe ich ein Beispiel-Projekt angelegt, welches noch gebuilded werden muss (bin- und obj-Ordner habe ich entfernt): https://www.file-upload.net/download...Error.zip.html
Hätte jemand eine Ahnung, wie ich das Binding-Problem beseitigt bekomme?
ich habe in verschiedenen TreeView-Elementen dazugehörige DataGrids. Wenn der Benutzer nun eine Reihe aus einem beliebigen DataGrid anwählt, so möchte ich, dass das SelectedItem an andere Controls (Textboxen) gebunden wird. Das klappt aber leider nur beim Selektieren der ersten DataGrid.
Ich habe die Frage zuvor auch schon auf StackOverflow gestellt, wobei ich bisher allerdings noch auf keine Lösung gekommen bin.
Das TreeView mit samt deren DataGrid wird wie folgt dargestellt und gebunden:
[highlight=c#]
<TreeView ItemsSource="{Binding Path=PlaceList}">
<TreeView.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding Path=Name}">
<DataGrid ItemsSource="{Binding MachinesInPlace, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedMachine, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</TreeViewItem>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
[/highlight]
Die Textboxen, die die selektierte Eigenschaft abgreifen sollen, funktionieren wie folgt:
[highlight=c#]
<TextBox Text="{Binding PlaceList/SelectedMachine.Id, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
[/highlight]
Ich arbeite mit dem MvvmLight-Framework. Innerhalb des ViewModels habe ich eine ObservableCollection mit Places angelegt. An diese ist die TreeView gebunden.
[highlight=c#]
public ObservableCollection<PlaceModel> PlaceList { get; set; } = new ObservableCollection<PlaceModel>();
[/highlight]
Das PlaceModel an sich beinhaltet dann noch eine Maschinen-Liste, die angibt, welche Maschinen im Platz vorhanden sind. Außerdem ist dort die selektierte Maschine enthalten.
[highlight=c#]
public class PlaceModel
{
public int Id { get; set; }
public string Name { get; set; } = "_CurrentObjectName";
public ObservableCollection<MachineModel> MachinesInPlace { get; set; }
public MachineModel SelectedMachine { get; set; }
}
[/highlight]
Jetzt besteht der Fehler, dass die Textbox nur die Items aus dem ersten Datagrid annimmt. Jedes nachfolgende Datagrid wird ignoriert.
Meine Idee wäre es jetzt innerhalb des ViewModels die Eigenschaft SelectedMachine anzulegen. Würde mMn. auch mehr Sinn machen, als dies in jedem Platz-Modell zu tun. Das Problem ist dann das zwar die Textbox auf die Property aus dem ViewModel zugreifen kann, ich aber nicht mehr das SelectedItem-Property der DataGrid daran binden kann. Das SelectedItem-Property kann ich glaube ich nur an Eigenschaften aus der zuvor gebundenen PlatzListe (PlaceList) binden.
Falls sich das Problem genauer anschauen möchte, habe ich ein Beispiel-Projekt angelegt, welches noch gebuilded werden muss (bin- und obj-Ordner habe ich entfernt): https://www.file-upload.net/download...Error.zip.html
Hätte jemand eine Ahnung, wie ich das Binding-Problem beseitigt bekomme?
Comment