[Editar]: He descubierto cómo hacerlo yo solo. Publiqué mi solución con la esperanza de que le ahorre a alguien más unos pocos días de búsqueda de Google. Si eres un gurú de WPF, mira mi solución y avísame si hay una forma mejor/más elegante/más eficiente de hacerlo. En particular, estoy interesado en saber lo que no sé ... ¿cómo va esta solución a arruinarme el camino? El problema realmente se reduce a exponer las propiedades de control interno.Exponer propiedades de control interno para vincular en WPF
Problema: Estoy creando un código para autogenerar una GUI enlazada a datos en WPF para un archivo XML. Tengo un archivo xsd que puede ayudarme a determinar los tipos de nodo, etc. Los elementos simples de clave/valor son fáciles.
Cuando analizar este elemento:
<Key>value</Key>
puedo crear un nuevo 'KeyValueControl' y establecer el DataContext
a este elemento. KeyValue se define como UserControl y solo tiene algunos enlaces simples. Funciona muy bien para cualquier XElement simple.
El XAML dentro de este control es el siguiente:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
El resultado es una línea que tiene una etiqueta con el nombre del elemento y un cuadro de texto con el valor que pueda editar.
Ahora, hay ocasiones en las que necesito mostrar los valores de búsqueda en lugar del valor real. Me gustaría crear un 'KeyValueComboBox' similar al KeyValueControl anterior pero poder especificar (basado en la información del archivo) las rutas de ItemsSource, Display y Value. Los enlaces 'Nombre' y 'Valor' serían los mismos que KeyValueControl.
No sé si un control de usuario estándar puede manejar esto, o si necesito heredar de Selector.
El XAML en el control sería algo como esto:
<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]/>
En mi código, yo luego hacer algo como esto (suponiendo que este nodo es una 'cosa' y necesita mostrar una lista de cosas que el usuario puede seleccionar el ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
Así que mis preguntas son:
1) ¿Debo heredar mi KeyValueComboBox de control o la de selección?
2) Si debo heredar de Control, ¿cómo exponer ItemsSource, DisplayMemberPath, y ValueMemberPath del Combo Box interno para el enlace?
3) Si necesito heredar de Selector, ¿alguien puede darme un pequeño ejemplo de cómo podría comenzar con eso? De nuevo, soy nuevo en WPF, por lo que un ejemplo simple y agradable sería de gran ayuda si ese es el camino que debo tomar.
estoy usando una técnica similar pero meterse en problemas cuando mi los elementos mismos están configurados para usar enlaces RelativeSource. Entonces en su caso si asignó una colección de elementos ComboBoxItem como su ItemsSource y uno tiene un enlace a algo en el árbol lógico usando el enlace RelativeSource a FindAncestor para enlazar a una propiedad definida en ese elemento anscestor entonces el enlace fallará. – jpierson
Acabo de usar esto para un caso muy similar, buena respuesta. En mi Aplicación, me estaba vinculando al SelectedItem de un Combobox. Solo se debe tener en cuenta que para que el enlace funcione correctamente, en algunos casos es necesario agregar el modo de enlace = twoway y UpdateSourceTrigger = PropertyChanged – Cocomico