Pregunta

Tengo 3 tablas: Artículo - que es el DataContext - que tiene una columna Grupo de navegación Grupo -. Tiene una categoría columna de navegación

Quiero tener en la cuadrícula de datos tanto (categoría y grupo) columnas y cuando elijo una categoría que debería mostrar en la col grupo sólo los Category.Groups.

Aquí está el código que estoy trabajando en:

<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
    <tk:DataGrid.Columns>

        <!--Works-->
        <tk:DataGridComboBoxColumn                                        
            Header="Categroy" 
            DisplayMemberPath="Title"                    
            SelectedValuePath="CategoryId"
            SelectedValueBinding="{Binding Group.Category.CategoryId}"
            ItemsSource="{Binding Context.Categories, 
                Source={x:Static Application.Current}}"
        />


        <!--Look at these two things:-->

        <!--This does work-->
        <tk:DataGridTemplateColumn>
            <tk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ItemsControl
                        ItemsSource="{Binding Group.Category.Groups}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate DataType="{x:Type data:Group}">
                                <TextBlock Text="{Binding Title}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </tk:DataGridTemplateColumn.CellTemplate>
        </tk:DataGridTemplateColumn>

        <!--But this does NOT work, even it's the same source-->
        <!--Notice I even tried a dummy converter and doesnt reach there-->
        <tk:DataGridComboBoxColumn 
            Header="Group" 
            DisplayMemberPath="Title"
            SelectedValuePath="GroupId"
            ItemsSource="{Binding Group.Category.Groups,
                Converter={StaticResource DummyConverter}}"
            SelectedValueBinding="{Binding Group.GroupId}"
            />

    </tk:DataGrid.Columns>
</tk:DataGrid>

Actualizar
¿Diría que el problema es que la propiedad ItemsSource no se puede ajustar a una unión no estática? Sospecho así porque incluso me puse la ItemsSource a {Binding} con el DummyConverter no se detiene en el convertidor; Y en la categoría ComboBox que trabaja muy bien.

¿Fue útil?

Solución

Las columnas de la cuadrícula de datos no tienen un DataContext, ya que nunca se agregan al árbol visual. sonar un poco raro, pero echar un vistazo a el blog de Vince, su conseguido un buen ejemplo de la disposición visual. una vez que se dibuja la cuadrícula las células tienen un contexto de datos y se puede ajustar la fuente de cuadros combinados artículos en ellos usando enlaces normales (recursos no estáticas ..)

Puede acceder al cuadro combinado elementos de origen como tal:

<dg:DataGridComboBoxColumn>
   <dg:DataGridComboBoxColumn.EditingElementStyle>
      <Style TargetType="ComboBox">
         <Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
      </Style>
   </dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>

Tenga una mirada aquí y también aquí por algún código. También tendrá que configurar la fuente de artículos para el elemento no la edición por

Otros consejos

Yo estaba usando MVVM y quería obligar a la ItemSource de la columna a una colección de objetos en el contexto de datos ventana. Debo haber intentado 10 formas diferentes y nada funcionó hasta que encontré esta respuesta .

El truco es definir un CollectionViewSource fuera de la cuadrícula y, a continuación referencia a él dentro de la cuadrícula usando StaticResource. Por ejemplo,

<Window.Resources>
    <CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" />
</Window.Resources>
<!-- ... -->
<DataGrid ItemsSource="{Binding MyRecords}">
    <DataGridComboBoxColumn Header="Column With Predefined Values"
                            ItemsSource="{Binding Source={StaticResource ItemsCVS}}"
                            SelectedValueBinding="{Binding MyItemId}"
                            SelectedValuePath="Id"
                            DisplayMemberPath="StatusCode" />
</DataGrid>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top