Pergunta

Em um datagrid, tenho duas datagridComBoboxColumns. Os itens de uma dessas colunas devem depender do que é selecionado na outra coluna. A coleção subjacente usada para modelar isso é um dictionary<string,List<string>>. Como devo implementar isso? Não consigo me conectar a nenhum evento relevante nas colunas e não consigo encontrar nenhum cenário de banco de dados que apóie isso ..

Foi útil?

Solução 2

Em vez de usar um datagridcomboboxcolumn para a segunda coluna, fui com um datagridTemplatecolumn com um ComboBox incorporado. Para o itemsource, eu defini um conversor: string -> List<string>. O conversor traduz o valor do seleção do outro datagridComboBox (que está vinculado a Navn) em List<string>, esta é apenas uma pesquisa de dicionário.

Igual a:

<my:DataGridTemplateColumn>
                <my:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox  SelectedItem="{Binding Værdi}" 
                                    ItemsSource="{Binding Navn,  Converter={StaticResource dimensionToValues}}"
                                   > 
                        </ComboBox>
                    </DataTemplate>
                </my:DataGridTemplateColumn.CellTemplate>
            </my:DataGridTemplateColumn>

Outras dicas

Eu tive o mesmo cenário um tempo atrás e consertei assim:

  public class DataItem : INotifyPropertyChanged {
  ...

  public List<SomeObject> DisplayableComboBoxItems { 
    get; set;
}

private static Dictionary<int, List<SomeObject>> myDict;    

public Dictionary<int, List<SomeObject>> MyDict {
    get {
        if (myDict == null) {
            myDict = GetYourDataFromSomewhere();
        }
        return myDict;
    }
}

public int TypeId {
    get { return typeId; }
    set {
        if (value == typeId) return;
        typeId = value;
        RaisePropertyChanged("TypeId");
    }
}

public int TypeSetId {
    get { return typeSetId; }
    set {
        if (typeSetId == value) return;         
        typeSetId = value;
        RaisePropertyChanged("TypeSetId");
        DisplayableComboBoxItems = MyDict[typeSetId];
        RaisePropertyChanged("DisplayableComboBoxItems");
        TypeId = 0;                
    }
}
...
}

Dataitem é o objeto que é vinculado a um Datarow. Esta é apenas uma pequena maquete do código. Basicamente, sempre que as alterações no tipo de composição, eu precisava de uma nova lista de tipos a serem exibidos. Eu usei apenas uma lista estática, neste exemplo eu usei um dicionário.
Com essa configuração, você pode vincular o CombOBox Itens Source ao 'DisplabableCombOBoxItems' e seu valor selecionado para "typeId". Você precisará de outras propriedades para exibir o texto correto em vez do tipoID.
A desvantagem disso é que, quando você tem mais de 1000 itens, terá a mesma lista para todos os itens. No entanto, esse não foi o caso para mim (o DataGrid mostrou max 50 itens).

Espero que isso seja claro o suficiente e que ajude você na direção certa!

Felicidades!
Roel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top