WPF Master-Details-Ansicht mit Listbox und Combobox mit Bindung
Habe ich gesucht um eine Antwort auf meine Frage jetzt seit ein paar Tagen, aber bin nicht in der Lage, eine Lösung zu finden.
Das problem ist, dass die combobox aktualisiert die Test-Objekt im User-Klasse, mit der die zuvor ausgewählte Benutzer'.
d.h. Sie wählen Sie Benutzer2 und user2 hat test2 wählen Sie dann, user5, dass hat test5. Nun, wenn Sie wählen Sie Benutzer2 wieder, es wird sich zeigen, dass es test5.
Hier ist ein code. Ich habe zwei-Klassen-Benutzer und-Tests. Und zwei ObservableCollections für jeden von denen. Dies ist, wie ich habe Sie setup:
public class User
{
public string Name { get; set; }
public int test { get; set; }
public test userTest { get; set; }
}
public class test
{
public int ID { get; set; }
public String Name { get; set; }
}
public class ListOfTests:ObservableCollection<test>
{
public ListOfTests()
{
for (int i = 0; i < 4; i++)
{
test newTest = new test();
newTest.ID = i;
newTest.Name = "Test " + i;
Add(newTest);
}
}
}
public class ListOfUsers: ObservableCollection<User>
{
public ListOfUsers()
{
ListOfTests testlist = new ListOfTests();
for (int i = 0; i < 10; i++)
{
User newUser = new User();
newUser.Name = "User " + i;
newUser.ID = i;
newUser.userTest = testlist[i];
Add(newUser);
}
}
}
Und XAML:
<Window x:Class="ComboboxTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ComboboxTest"
Title="Window1" Height="300" Width="300">
<StackPanel x:Name="SP1">
<StackPanel.Resources>
<local:ListOfTests x:Key="ListOfTests" />
</StackPanel.Resources>
<ListBox ItemsSource="{Binding}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True"/>
<TextBox Text="{Binding Path=Name}" Foreground="Black" />
<TextBox Text="{Binding Path=userTest}" />
<ComboBox SelectedItem="{Binding Path=userTest}"
SelectedValue="{Binding Path=userTest.ID}"
ItemsSource="{Binding Source={StaticResource ListOfTests}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
Foreground="Black" />
</StackPanel>
Nun, wenn ich die Bindung auf den SelectedItem auf "{Binding Path=userTest, Mode=OneWay}", dann funktioniert es, aber ich kann es nicht ändern es manuell.
Hier ist ein kicker gedacht... Wenn ich den Gegner .Net 4.0 (VS2010), dann funktioniert es einwandfrei...
Kann jemand bitte helfen Sie mir eine Lösung finden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich das Verständnis Ihrer Frage, es klingt wie das WPF wird nicht benachrichtigt, wenn der Wert einer Eigenschaft ändert. Sie können dies umgehen, durch die Umsetzung der INotifyPropertyChanged - Schnittstelle. Zum Beispiel, die
User
- Klasse würde wie folgt Aussehen:Sollten Sie wahrscheinlich das gleiche tun für Ihr
test
Klasse, wie gut.WPF Uhr für, wenn die
PropertyChanged
- Ereignis ausgelöst wird, und updates alle betroffenen Bindungen, wie gebraucht. Dies sollte dazu führen, dass das ausgewählte Element in derComboBox
zurück zu wechseln, um den test für user2.Update: OK, ich glaube, ich habe diese arbeiten. Ich denke, dass Sie sind nicht Teil des Codes in dem, was du geschrieben (wie das, was die
DataContext
für dieWindow
ist), aber hier ist, was ich habe zu arbeiten:Erstellte ich eine Klasse namens
ViewModel
, die dieDataContext
der wichtigstenWindow
. Hier ist der code:Zog ich die Erstellung der beiden Listen zu Programmieren. Eine Sache, die ich bemerkte in Ihrem Beispiel ist, dass eine Instanz von
ListOfTests
wurde alsItemsSource
desComboBox
, während eine andere Instanz verwendet wurde, zu bauenListOfUsers
. Ich bin mir nicht sicher, ob dies Teil des Problems ist oder nicht, aber es ist besser, einfach eine Liste mit den tests.Den XAML-Code für die wichtigsten
Window
ist folgende:Den Schlüssel, um zu bekommen, was ist die
CurrentUser
Eigenschaft. Es ist gebunden anListBox.SelectedItem
, undComboBox.SelectedItem
gebunden istCurrentUser.UserTest
. Dies wird sich ändern die Auswahl in dieComboBox
zu vertreten, die Prüfung der ausgewählten Benutzer in dieListBox
.Habe ich diese alle arbeiten mit Visual Studio 2008 SP1, also wird es hoffentlich auch für Sie arbeiten. Wenn Sie irgendwelche Probleme haben, bekommen dies funktioniert, lasst es mich wissen und ich werde sehen was ich tun kann.
Andy,
Hier ist ein lesenswerter Auszug aus dem code, den ich jetzt habe.
Sieht besser aus als in den Kommentaren.
Grüße
Corne