문제

DataGrid가 두 개의 열이 ComboBoxes (하나는 거의 없지만 문제가 아님)

사용자가 첫 번째 콤보 값을 변경하면 다른 열의 ComboBox가 해당 속성에 바인딩해야합니다 (이 속성은 컬렉션입니다). 첫 번째 ComboBox가 카테고리 인 경우 사용자가 값을 변경하면 다른 CB는 (첫 번째 콤보의 선택한 카테고리)의 값으로 채워지고 싶습니다.

어떻게해야합니까, 나는 MVVM을 사용하지 않고 단순한 WPF를 사용하지 않습니다. 나는 그것을 구현할 올바른 방법이 무엇인지 모르겠다, 나는 그것을 바로 그것을 시작하기를 바랍니다.

나는 첫 번째 SelectionChangeHandler에서 다른 ComboBox (다른 DataGridCell에 있음)를 얻을 수 있기 때문에 첫 번째 선택의 각 선택 변경에서 소스를 재설정 할 수 있습니다. 현재 (첫 번째) DataGridCell에 도달 할 수있는 기능이 있습니다. 즉, 오른쪽 DataGridCell 형제 자매에 액세스하는 효율적인 방법을 찾고 자식 (두 번째) 콤보를 얻을 수 있습니다.

또한 선택한 카테고리가 행에서 행마다 다를 수 있으며 두 번째 ComboBox는이 행의 범주에 따라 다릅니다.
나는 실제로 collectionViewSource.source가 현재 항목 (즉, 행의 dataContext)에 바인딩되어 있지만 작동하는 것처럼 보이지 않도록 실제로 구현하려고 노력했습니다. 첫 번째 ComboBox의 SelectionChange에서 동작 트리거 또는 핸들러를 통해 두 번째 콤보의 CollectionViewSource (VendorScollection)를 설정하는 것을 선호합니다.

해당 필드의 다른 콤보 옥스는 모두 문제가되는 것처럼 보이지 않습니다. collectionviewsource.filter를 사용할 수 있습니다. 어쨌든 그것은 단순한 형제 자매이기 때문에 액세스하는 것이 아닙니다. 다른 DataGridCell에서 깊은 곳에 위치한 먼 첫 번째 사람입니다.

여기에서 내가 지금까지 시도한 것입니다 :

<DataGrid>
    <DataGrid.Resources>
        <CollectionViewSource x:Key="CategoriesCollection" Source="{Binding Context.CategoriesList, Source={x:Static Application.Current}, IsAsync=True}" />
    </DataGrid.Resources>

    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Category">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock DataContext="{Binding Category}" Text="{Binding Title}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <!--This is the first ComboBox-->
                    <ComboBox
                                IsSynchronizedWithCurrentItem="False"
                                ItemsSource="{Binding Source={StaticResource CategoriesCollection}}"
                                DisplayMemberPath="Title"
                                SelectionChanged="cbCategories_SelectionChanged"
                                SelectedItem="{Binding Category}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Style">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock DataContext="{Binding Finish.Style.Vendor}" Text="{Binding Contact.Title}"/>
                        <TextBlock DataContext="{Binding Finish.Style}" Text="{Binding Title}"/>
                        <TextBlock Text="{Binding Finish.Title}"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <StackPanel>
                        <StackPanel.Resources>
                            <!--I want, that when the user selects a value in the first ComboBox,
                    the VendorsCollection below should be populated with the selected Category.Vendors,
                    or alternatively current row's data item.Category.Vendors,
                    I just donno how to access current row from these resources.-->
                            <CollectionViewSource x:Key="VendorsCollection" Source="{Binding Vendors, Source={StaticResource CategoriesCollection}}" />
                            <CollectionViewSource x:Key="StylesCollection" Source="{Binding Styles, Source={StaticResource VendorsCollection}}" />
                            <CollectionViewSource x:Key="FinishesCollection" Source="{Binding Finishes, Source={StaticResource StylesCollection}}" />
                        </StackPanel.Resources>
                        <ComboBox                                                       
                                    IsSynchronizedWithCurrentItem="True"
                                    ItemsSource="{Binding Source={StaticResource VendorsCollection}}"
                                    SelectedItem="{Binding Finish.Style.Vendor}"
                                    DisplayMemberPath="Contact.Title"/>
                        <ComboBox
                                    IsSynchronizedWithCurrentItem="True"
                                    ItemsSource="{Binding Source={StaticResource StylesCollection}}"
                                    SelectedItem="{Binding Finish.Style}"
                                    DisplayMemberPath="Title"/>
                        <ComboBox
                                    IsSynchronizedWithCurrentItem="True"
                                    ItemsSource="{Binding Source={StaticResource FinishesCollection}}"
                                    SelectedItem="{Binding Finish}"
                                    DisplayMemberPath="Title"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>
</DataGrid>
.

도움이 되었습니까?

해결책

방금 질문을 왔습니다.문제가 해결 되었습니까?나는 당신의 질문이 이 하나의 i와 유사하다고 생각합니다.왔어.해결책이 당신을 도울 수 있기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top