C# WPF에서 {x:Reference} 이해하기

{x:Reference}는 XAML에서 사용하는 마크업 확장(Markup Extension) 중 하나로, 다른 이름이 지정된 XAML 요소에 대한 참조를 얻는 데 사용됩니다.

기본 구문

{x:Reference 요소이름}

1. 다른 요소의 속성 바인딩 시 활용

일반적으로 {x:Reference}ElementName을 대체하여 사용됩니다.

<StackPanel>
    <Slider x:Name="mainSlider" Minimum="0" Maximum="100"/>
    <TextBox Text="{Binding Path=Value, Source={x:Reference mainSlider}}"/>
</StackPanel>

2. 객체 참조가 필요한 모든 곳에서 사용 가능

바인딩 외에도 {x:Reference}는 객체 참조가 필요한 다양한 상황에서 사용할 수 있습니다.

<StackPanel>
    <Button x:Name="buttonA" Content="첫 번째 버튼"/>
    
    <!-- 두 번째 버튼의 CommandTarget을 buttonA로 설정 -->
    <Button Content="두 번째 버튼"
            CommandTarget="{x:Reference buttonA}"
            Command="ApplicationCommands.Paste"/>
</StackPanel>

{x:Reference}와 ElementName 비교

ElementName 사용 예제:

<TextBox Text="{Binding Value, ElementName=mainSlider}"/>

{x:Reference} 사용 예제:

<TextBox Text="{Binding Value, Source={x:Reference mainSlider}}"/>

두 방법 모두 동일한 결과를 제공하지만, {x:Reference}는 더 유연하게 사용될 수 있습니다.

주요 활용 사례

1. 비바인딩 상황에서의 사용

<Grid>
    <TextBlock x:Name="headerText" Text="헤더 텍스트"/>
    
    <!-- ToolTip의 PlacementTarget을 headerText로 설정 -->
    <Button Content="도움말" 
            ToolTip="{x:Reference headerText}" 
            ToolTipService.PlacementTarget="{x:Reference headerText}"/>
</Grid>

2. 스타일 내에서의 사용

<Style TargetType="TextBox">
    <Setter Property="Text" 
            Value="{Binding Value, Source={x:Reference mainSlider}}"/>
</Style>

3. 서로 다른 컨테이너에 있는 요소 참조

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    
    <Slider x:Name="sliderControl" Grid.Row="0"/>
    
    <StackPanel Grid.Row="1">
        <!-- 다른 패널에 위치한 sliderControl 참조 -->
        <TextBox Text="{Binding Value, Source={x:Reference sliderControl}}"/>
    </StackPanel>
</Grid>

주의사항

1. 같은 네임스코프 내에서만 참조 가능

<!-- 정상 작동 -->
<Window>
    <Slider x:Name="sliderExample"/>
    <TextBox Text="{Binding Value, Source={x:Reference sliderExample}}"/>
</Window>

<!-- 문제가 발생할 수 있음 -->
<Window>
    <UserControl>
        <Slider x:Name="sliderExample"/>
    </UserControl>
    <!-- sliderExample은 다른 네임스코프에 있으므로 참조 불가 -->
    <TextBox Text="{Binding Value, Source={x:Reference sliderExample}}"/>
</Window>

2. 순환 참조 방지

<!-- 에러: 순환 참조 -->
<TextBox x:Name="textSample" Text="{Binding Text, Source={x:Reference textSample}}"/>

결론

{x:Reference}는 XAML 요소 간의 참조를 설정하는 데 매우 유용합니다.

  • 기능: 이름으로 XAML 요소의 참조를 가져옵니다.
  • 사용처: 바인딩, 명령 대상, 스타일 등 다양한 상황에서 다른 요소를 참조합니다.
  • 장점: ElementName보다 더 유연하며 비바인딩 상황에서도 사용 가능합니다.
  • 제약사항: 참조되는 요소는 반드시 x:Name을 가지고 있어야 하며 같은 네임스코프 내에 있어야 합니다.

이를 통해 XAML의 참조 메커니즘을 더욱 깊이 이해할 수 있습니다.

태그: WPF XAML C#

6월 3일 23:48에 게시됨