DataGrid에 Combobox ItemsSource를 바인딩 하는 문제

안녕하세요.

아직도 바인딩의 개념을 제대로 파악을 못했나봅니다.ㅠㅠ

일단 제가 사용하는 DataGrid의 DataContext는 UserControl의 ObservableCollection Provider 란 컬렉션을 갖고 있습니다.

그 안에 Column으로 Combobox를 사용하려고 합니다. 그런데 문제는

DataGrid의 내부에서 ComboBox ItemsSource로 접근하니까 당연히 바인딩이 안되는 문제가 발생하네요…

다시 말하자면,

CameraGridView.xaml

///////////////////////

<DataGrid Grid.Row="1"
                  ItemsSource="{Binding Provider"/>

CameraGridViewModel.cs

ObservableCollection<ItemViewModel> Provider

이렇게 되면 ComboBox의 ItemsSource는 당연히 ItemViewModel이란 컨텍스 내부에서 찾게 되는데요.

저는 CameraGridViewModel의 컨텍스트에서 찾고 싶은데 어떻게 하면 가능할까요?

CameraGridView.xaml

   <UserControl.Resources>
       
        <CollectionViewSource x:Key="CameraComboSource"
                              Source="{Binding CameraComboProvider}" />
    </UserControl.Resources>

.
.
.
<DataGrid Grid.Row="1"
                  ItemsSource="{Binding Provider.CollectionEntity}"
                  
                  Style="{StaticResource MaterialDesignDataGrid }"
                  AutoGenerateColumns="False"
                  EnableRowVirtualization="False"
                  CanUserSortColumns="True"
                  CanUserReorderColumns="False"
                  CanUserResizeColumns="True"
                  SelectionMode="Single"
                  SelectionUnit="FullRow"
                  SelectedItem="{Binding SelectedViewModel}"
                  CanUserAddRows="False"
                  ScrollViewer.CanContentScroll="True"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ScrollViewer.HorizontalScrollBarVisibility="Auto">
            <DataGrid.Columns>
                          
                
                <DataGridTemplateColumn  Header="카메라이름"
                                         SortMemberPath="NameDevice"
                                         CanUserSort="True">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding NameDevice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox VerticalAlignment="Center"
                                      IsEditable="False"
                                      ItemsSource="{Binding Source={StaticResource CameraComboSource}}"
                                      SelectedItem="{Binding NameDevice, UpdateSourceTrigger=PropertyChanged}">

                                <ComboBox.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <VirtualizingStackPanel />
                                    </ItemsPanelTemplate>
                                </ComboBox.ItemsPanel>
                                <ComboBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding }" />
                                    </DataTemplate>
                                </ComboBox.ItemTemplate>
                                <ComboBox.ItemContainerStyle>
                                    <Style TargetType="{x:Type ComboBoxItem}">
                                    </Style>
                                </ComboBox.ItemContainerStyle>
                            </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                
           


            </DataGrid.Columns>
        </DataGrid>

이렇게 해서 ComboBox의 ItemsSource를 위한 ObservableCollection을 바인딩 해주는 작업을 하고 staticResource로 접근해도 아무것도 안나오네요. 바인딩에러는 안뜹니다.

조언 부탁드립니다.

3개의 좋아요
<Window
    x:Class="WpfComboBoxBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfComboBoxBinding"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Name="window"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <ComboBox
            Width="120"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            ItemsSource="{Binding Items, Mode=OneWay}"
            SelectedItem="{Binding SelectedItem}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                        <Run Text="{Binding DataContext.ItemKind, ElementName=window, Mode=OneWay}" />
                        <Run Text="{Binding Text, Mode=OneWay}" />
                    </TextBlock>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>
</Window>

위의 XAML은 예시고요, DataContext에 접근하기 위해 Window에 window라는 이름을 줘서 ElementName을 사용했고 이렇게 Combobox의 ItemTemplate에서 사용할 수 있습니다.

image

소스코드

4개의 좋아요

RelativeSource 바인딩 속성으로 레벨이나 타겟을 지정할 수 있고
@dimohy 님 답글 처럼 ElementName 으로 타겟을 직접 지정해서 처리 하셔도 됩니다.

개인적으로는 내부 처리방식에 있어 RelativeSource는 느리기 때문에 후자의 방식이 더 좋습니다.

4개의 좋아요

감사합니다. 해결했습니다.

1개의 좋아요

감사합니다. 해결했습니다.!

1개의 좋아요