es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for 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:

    <combobox itemssource="{Binding Model.parametersOfCategories.Keys}"></combobox>
    

    Después, enlaza la propiedad SelectedItem de ComboBoxA a la propiedad chosenCategory de tu ViewModel:

    <combobox itemssource="{Binding Model.parametersOfCategories.Keys}" selecteditem="{Binding ChosenCategory}"></combobox>
    

    Luego, enlaza la propiedad ItemsSource de ComboBoxB a los valores del diccionario:

    <combobox itemssource="{Binding Model.parametersOfCategories[ChosenCategory]}"></combobox>
    

    Finalmente, enlaza la propiedad SelectedItem de ComboBoxB a la propiedad chosenParameter de tu ViewModel:

    <combobox itemssource="{Binding Model.parametersOfCategories[ChosenCategory]}" selecteditem="{Binding ChosenParameter}"></combobox>
    

    Estos enlaces actualizarán automáticamente las opciones en ComboBoxB cada vez que el usuario seleccione un nuevo elemento en ComboBoxA.

Comments are closed.