WPF, MVVM Población de ComboBox en Cascada desde un diccionario.
Entonces, tengo un UserControl que contiene dos combobox, que quiero que se llenen con un diccionario. Así ComboBoxA se llena con las claves del diccionario, y ComboBoxB se llena con el diccionario[ComboBoxA ítem seleccionado]. ¿Cómo puedo lograrlo usando MVVM? La categoría es básicamente un int y el parámetro es una cadena.
Mi código hasta ahora:
Modelo
public class CategoryUserControlModel
{
public Dictionary<category,></category,><parameter>> parametersOfCategories { get; set;}
public Category chosenCategory { get; set; }
public Parameter chosenParameter { get; set; }
}
ViewModel
public class CategoryUserControlViewModel
{
public CategoryUserControlViewModel(CategoryUserControlModel controlModel)
{
Model = controlModel;
}
public CategoryUserControlModel Model { get; set; }
public Category ChosenCategory
{
get => Model.chosenCategory;
set
{
Model.chosenCategory = value;
}
}
public Parameter ChosenParameter
{
get => Model.chosenParameter;
set => Model.chosenParameter = value;
}
}
XAML
<grid>
<combobox x:name="Categories" horizontalalignment="Left" margin="0,14,0,0" verticalalignment="Top" width="120" itemssource="{Binding Model.parametersOfCategories.Keys}"></combobox>
<textblock x:name="Text" horizontalalignment="Left" height="15" margin="0,-2,0,0" textwrapping="Wrap" text="Категория" verticalalignment="Top" width="60"></textblock>
<combobox x:name="Parameter" horizontalalignment="Left" margin="125,14,0,0" verticalalignment="Top" width="120" itemssource="{Binding Model.parametersOfCategories.Values}"></combobox>
<textblock x:name="ParameterText" horizontalalignment="Left" height="15" margin="125,-2,0,0" textwrapping="Wrap" text="Параметр" verticalalignment="Top" width="60"></textblock>
</grid>
davy.ai
Para lograr esto, puedes utilizar el enlace de datos en tu XAML. Ya has definido las propiedades necesarias en tu ViewModel y Modelo. Solo necesitas agregar el enlace en el XAML.
Primero, enlaza la propiedad ItemsSource de ComboBoxA a las claves del diccionario:
Después, enlaza la propiedad SelectedItem de ComboBoxA a la propiedad chosenCategory de tu ViewModel:
Luego, enlaza la propiedad ItemsSource de ComboBoxB a los valores del diccionario:
Finalmente, enlaza la propiedad SelectedItem de ComboBoxB a la propiedad chosenParameter de tu ViewModel:
Estos enlaces actualizarán automáticamente las opciones en ComboBoxB cada vez que el usuario seleccione un nuevo elemento en ComboBoxA.