GroupBox에 DataTemplate을 적용시 버튼 클릭 문제

<Window x:Class="WpfApp1.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Background="gray">

    
    <Window.Resources>
        <Style x:Key="TestMain"
               TargetType="GroupBox">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate DataType="local:Model">
                        <Grid ShowGridLines="True">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="100*" />
                                <RowDefinition Height="100*" />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50*" />
                                <ColumnDefinition Width="50*" />
                            </Grid.ColumnDefinitions>

                            <Label Content="제목"
                                   Grid.Row="0"
                                   Grid.Column="0"
                                   FontSize="20"
                                   HorizontalContentAlignment="Center"
                                   VerticalContentAlignment="Center"/>

                            <Label Content="바꿀 라벨"
                                   x:Name="lbl_change"
                                   Grid.Row="0"
                                   Grid.Column="1"
                                   FontSize="20"
                                   HorizontalContentAlignment="Center"
                                   VerticalContentAlignment="Center"/>

                            <Button Content="바꾸기"
                                    Grid.Row="3"
                                    Grid.Column="0"
                                    Margin="10,10,10,10"/>

                            <Button Content="지우기"
                                    Grid.Row="3"
                                    Grid.Column="1"
                                    Margin="10,10,10,10"/>
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <GroupBox Grid.Column="0"
                  x:Name="grp01"
                  Header="GroupBox"
                  Margin="10,10,10,10"
                  Background="White"
                  Style="{StaticResource TestMain}" />
        <GroupBox Grid.Column="1"
                  x:Name="grp02"
                  Header="GroupBox"
                  Margin="10,10,10,10"
                  Background="White"
                  Style="{StaticResource TestMain}" />

    </Grid>
</Window>


  • 원하는 결과
    ** GroupBox안에 있는 양식을 여러번 사용해야 합니다. (3*3 9개를 배치)
    ** Window.ResourceDictionary에서 DataTemplate을 이용하여 여러번 재사용 가능
  1. ‘grp01’(좌측 groupbox)에서 ‘바꾸기’ 버튼 클릭 > 새 창을 띄워 값 입력받기
  2. 입력 받은 값을 'grp01’의 '바꿀 라벨’에 넣기
  3. 'grp01’의 ‘지우기’ 버튼 클릭시 'grp01’의 '바꿀 라벨’을 삭제됨으로 변경
  4. 'grp02’의 경우는 'grp02’에서만 동작

.
.

  • 현재 문제
  1. 그룹박스마다 'DataTemplate’을 설정하여 Click 이벤트를 이용하면 가능하지만 Window.ResourceDictionary xaml을 만들어 사용하려니 어떤 버튼이 눌러졌는지 확인이 안되어 문제 발생 ('grp01’의 '바꾸기’인지 'grp02’의 '바꾸기’인지 확인을 못하고 있음)
  2. 혹시 DataTemplate이 아닌 다른 방식으로 GroupBox양식을 만들 방법이 있는지

.

혹시 이런 경우에 어떻게 사용하시나요?
현재 .net4.8 WPF 환경입니다.

1개의 좋아요

UserControl를 만들고 사용하시는 것이 사용이 편하지 않을까요? GroupBox를 이용해야 하는 이유가 있나요?

3개의 좋아요

올려주신 소스를 보면 DatContext를 통한 Binding 구현 방법이 아닌 것 같습니다.

@I_Lee 님 문제처럼 Click 이벤트가 .cs에 연결은 되겠지만 DataTemplate 안에 구현되어 있는 lbl_change 객체를 클릭 이벤트 상에서 찾는 것이 불가능합니다.
(sender를 통해 어떤 객체인지는 찾을 수 있겠죠)

그래서 지금 구조에서 DataTemplate을 사용하기에는 문제가 있습니다.

따라서 @dimohy 님 말씀처럼 GroupBox 자체를 UserControl 안에 구현해서 재사용 하시면 될 것 같습니다. (또는 Binding)

부분이 아닌 실제 프로젝트를 깃허브 등으로 한번 올려주시면 더 좋을 것 같아요. :smile:

2개의 좋아요

GroupBox를 사용한 특별한 이유는 없습니다.
C#과 WPF 공부를 시작한 입장에서 여러 컨트롤을 GroupBox라는 것으로 묶을 수 있기에 사용했던것입니다.

유저 컨트롤에대해 잘 몰라서 사용을 못해봤습니다.
UserControl로 다시 만들어봐야겠네요
감사합니다.

3개의 좋아요