[Edytuj]: Pomyślałem, jak to zrobić na własną rękę. Wysłałem swoje rozwiązanie w nadziei, że uratuje ono kogoś innego przez kilka dni googlowania. Jeśli jesteś guru WPF, spójrz na moje rozwiązanie i daj mi znać, czy jest lepszy/bardziej elegancki/bardziej wydajny sposób, aby to zrobić. W szczególności jestem zainteresowany poznaniem tego, czego nie wiem ... jak to rozwiązanie doprowadzi mnie do szaleństwa? Problem naprawdę sprowadza się do ujawnienia właściwości kontroli wewnętrznej.Wystawienie właściwości kontroli wewnętrznej dla wiązania w WPF
Problem: Tworzę kod do automatycznego generowania GUI danych w WPF dla pliku XML. Mam plik xsd, który może mi pomóc określić typy węzłów itp. Proste elementy klucz/wartość są łatwe.
Kiedy przeanalizować ten element:
<Key>value</Key>
mogę utworzyć nowy 'KeyValueControl' i ustawić DataContext
do tego elementu. KeyValue jest zdefiniowana jako UserControl i ma tylko kilka prostych powiązań. Działa doskonale dla każdego prostego XElement.
XAML wewnątrz tej kontroli wygląda następująco:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
Rezultatem jest linia, która ma etykietę z nazwą elementu i pola tekstowego o wartości, które można edytować.
Są teraz czasy, w których muszę wyświetlać wartości wyszukiwania zamiast rzeczywistej wartości. Chciałbym utworzyć "KeyValueComboBox" podobny do powyższej KeyValueControl, ale być w stanie określić (w oparciu o informacje w pliku) ścieżki ItemsSource, Display i Value. Powiązania "Nazwa" i "Wartość" byłyby takie same jak KeyValueControl.
Nie wiem, czy standardowa kontrola użytkownika może sobie z tym poradzić, czy też muszę dziedziczyć z Selektora.
XAML w kontroli będzie wyglądać mniej więcej tak:
<Label Content={Binding Path=Name} />
<ComboBox SelectedValue={Binding Path=Value}
ItemsSource={Binding [BOUND TO THE ItemsSource PROPERTY OF THIS CUSTOM CONTROL]
DisplayMemberPath={Binding [BOUND TO THE DisplayMemberPath OF THIS CUSTOM CONTROL]
SelectedValuePath={Binding [BOUND TO THE SelectedValuePath OF THIS CUSTOM CONTROL]/>
W moim kodu, chciałbym następnie zrobić coś takiego (zakładając, że ten węzeł jest „rzecz” i wymaga, aby wyświetlić listę rzeczy, tak więc użytkownik może wybrać ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
Więc moje pytania to:
1) czy mogę odziedziczyć moja KeyValueComboBox z Control lub Selector?
2) Jeśli powinienem dziedziczyć po kontroli, w jaki sposób mogę odsłonić obiekt ItemsSource, DisplayMemberPath i ValueMemberPath w celu utworzenia powiązania?
3) Jeśli muszę dziedziczyć z Selectora, czy ktoś może podać mały przykład tego, jak mogę zacząć z tym? Ponownie, jestem nowy w WPF, więc ładny, prosty przykład naprawdę pomoże, jeśli jest to droga, którą muszę wziąć.
Używam podobną technikę, ale działa w kłopoty, kiedy mój same elementy są skonfigurowane do korzystania z powiązań RelativeSource. Tak więc w twoim przypadku, jeśli przypisałeś kolekcję elementów ComboBoxItem jako Tworzywo ItemsSource, a jeden ma powiązanie z czymś w drzewie logicznym, stosując wiązanie RelativeSource do FindAncestor w celu powiązania z właściwością zdefiniowaną w tym elemencie anscestor, to wiązanie się nie powiedzie. – jpierson
Po prostu użyłem tego dla bardzo podobnej sprawy, dobrej odpowiedzi. W mojej aplikacji byłam wiążąca dla SelectedItem z Combobox. Należy zauważyć, że aby wiązanie działało poprawnie, w niektórych przypadkach konieczne jest dodanie trybu wiązania = twoway i UpdateSourceTrigger = PropertyChanged – Cocomico