c# - from - wpf combobox items
Combobox de pares de valor clave en WPF (3)
No creo que un combobox directo sea el elemento de interfaz de usuario adecuado para usar en esta situación. El problema aquí es que el cuadro combinado no está diseñado para admitir pares clave / valor, especialmente si desea que el usuario pueda agregar valores al diccionario mientras se vincula a la clave. Por ejemplo, si les permite agregar un valor, ¿cómo agregan la clave o la tecla para actualizar?
Creo que la solución es tener dos controles: un cuadro combinado para la selección de clave y un cuadro de texto para la entrada de valor. El cuadro de texto de valores está oculto hasta que el usuario seleccione una tecla. Una vez que se selecciona la tecla, pídales que ingresen su entrada de valor en el cuadro de texto y presionen enter o un botón, luego establezca el valor en la tecla seleccionada.
Considere que tengo Colección de pares de valores clave (Clave Ex = Valor MSFT = MSFT Microsoft) que vinculo al ComboBox. DisplayMemeberPath = Valor. lo siguiente debe lograrse
Al seleccionar un ítem, solo la clave debe mostrarse en Combo,
el usuario también podría escribir un nuevo valor en el Combo.
No puedo encontrar la solución que admita estas dos características. Resolver uno rompe al otro.
<ComboBox IsTextSearchEnabled="True" Name="cmbBrokers" IsEditable="True"
ItemsSource="{Binding BrokerCodes}" SelectedValuePath="Key"
DisplayMemberPath="Value" Text="{Binding SelectedBroker, Mode=TwoWay}">
Supongo que lo que estás buscando es lo siguiente.
public class ComboBoxPairs
{
public string _Key { get; set; }
public string _Value { get; set; }
public ComboBoxPairs(string _key,string _value )
{
_Key = _key ;
_Value = _value ;
}
}
Luego sigues y usas esta clase como esta
List<ComboBoxPairs> cbp = new List<ComboBoxPairs>();
cbp.Add(new ComboBoxPairs("Microsoft", "MSFT"));
cbp.Add(new ComboBoxPairs("Apple", "AAPL"));
Y agréguela al cuadro combinado que tiene
cmbBrokers.DisplayMemberPath = "_Key";
cmbBrokers.SelectedValuePath = "_Value";
cmbBrokers.ItemsSource = cbp;
Y cuando necesite acceder solo haga esto
ComboBoxPairs cbp = (ComboBoxPairs)cmbBrokers.SelectedItem;
string _key = cbp._Key;
string _value = cbp._Value;
Esto es todo lo que necesitas hacer.
Ampliando el ejemplo de Adams con una solución aún más genérica.
En xaml.cs, cree una propiedad de colección observable y asígnele una colección.
ObservableCollection < KeyValuePair < string , string > > MyCollection { get; set; }
MyCollection = new ObservableCollection < KeyValuePair < string , string > > ( )
{
new KeyValuePair < string , string > ("key1" ,"value1"),
new KeyValuePair < string , string > ("key2" ,"value2")
};
En el archivo xaml, relacione su colección observable con la propiedad que creó en el código subyacente.
<ComboBox Grid.Row="3"
Grid.Column="1"
ItemsSource="{Binding MyCollection}"
DisplayMemberPath="Key" />
Puede cambiar DisplayMemberPath="Key"
a DisplayMemberPath="Value"
si desea mostrar el valor en su lugar.