2009-03-18 4 views
1

UI의 특정 "슬롯"에서 UIElement을 동적으로 교환하는 가장 작은 방법은 무엇입니까? 숫자가 UIElement이고 외부 데이터 바인딩 (예 : 콤보 상자 선택)에 따라 그 중 하나가 표시되고 현재 표시되어있는 것이 숨겨지기를 원합니다. 따라서이 동작은 TabControl과 비슷하지만 탭과 크롬 및 tabitem 인스턴스가 없습니다. 그래서 실제로는 TabControl을 사용하고 컨트롤 템플릿을 재정의 할 수 있습니다. 그러나 이것이 실제로 가장 최소한의 접근입니까?WPF에서 UIElement를 교환하는 컨트롤

답변

1

몇 가지 옵션이 있습니다. Bryan이 말했듯이, Data Template Selectors은 분명히 효과적 일 수 있지만, 나는 그들이 과잉이라고 자주 결정했다. 예를 들어 예를 들어 보겠습니다. 요소의 가시성을 ComboBox의 선택 영역에 바인딩하려면 ValueConverter을 사용하는 것이 좋습니다. 당신의 Window.Resources에서 지금

public class MyObjectToVisibleOrCollapsed : IValueConverter 
{ 
    #region IValueConverter Members 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is MyObject) 
     { 
      var myObject = (MyObject)value; 
      if (myObject.SomeState) 
      { 
       return Visibility.Visible; 
      } 
     } 

     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

ValueConverter의 인스턴스를 생성하고 ValueConverter 예를 사용하여 ComboBox.SelectedItem에 요소를 바인딩 : 다음 ConverterComboBox.SelectedItem에 합격해야 함은 가시성 값을 반환

<local:MyObjectToVisibleOrCollapsed x:Key="myObjectToVisibleOrCollapsed"/> 
<DataTemplate x:Key="MyTemplate"> 
    <TextBlock Text="{Binding Path=myText}" 
       x:Name="MyText" 
       Visibility="{Binding ElementName=MyComboBox, Path=SelectedItem, Converter={StaticResource myObjectToVisibleOrCollapsed}, Mode=Default}" /> 
</DataTemplate> 

물론 DataTemplate의 모든 요소에 대해 ValueConverter을 재사용 할 수 있습니다 (많은 요소가있는 경우 데이터 템플릿 선택기 방식이 더 바람직합니다).

[면책 조항 : 위의 코드는 테스트하지 메모리로부터 해시되었다 - 조금 조정이 필요할 수 있습니다]

2
<ContentControl Content="{Binding SomePropertyThatYieldsTheContent}"/> 
+0

http://stackoverflow.com/questions/1287995에 대한 답변을 바탕으로 ContentPresenter가 더 나은 선택 일 것이라고 생각합니다. – Wilka

-1

나는 그것이 서로의 상단에있는 요소를 레이어 필요에 따라 프로그래밍 방식으로 다시 축소에 가시에서 자신의 가시성 속성을 변경하는 것입니다 방법.

+0

우리 디자이너는 C#을 잘하지는 않지만 UI를 정의하는 디자이너입니다. – bitbonk

1

이 가장 간결한 방법입니다 경우 나도 몰라,하지만 당신은 DataTemplate를 사용하는 경우, 당신은 DataTrigger의를 사용할 수있다 (여기에 가정은 초기 가시성 Collapsed 때문이다) :

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=SourceProperty.ValueType}"> 
     <DataTrigger.Value> 
      <pm:ValueType>Text</pm:ValueType> 
     </DataTrigger.Value> 
     <Setter TargetName="TextEditor" Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=SourceProperty.ValueType}"> 
     <DataTrigger.Value> 
      <pm:ValueType>Logical</pm:ValueType> 
     </DataTrigger.Value> 
     <Setter TargetName="LogicalEditor" Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=SourceProperty.ValueType}"> 
     <DataTrigger.Value> 
      <pm:ValueType>DateTime</pm:ValueType> 
     </DataTrigger.Value> 
     <Setter TargetName="DateEditor" Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
... 
+0

이 방법은 몇 가지 "모드"만있는 경우 매우 효과적입니다. "편집"모드와 "읽기 전용"모드가 있습니다. 가시성을 숨김 또는 숨김으로 설정하고 동일한 격자 셀에 여러 요소가 있으므로 모드 변경 중에 다른 UI 요소가 바뀌지 않습니다. –

0

Data Template Selectors을 보면, Bea Stollnitz의 게시물은 here입니다. 기본적으로 각 UI "슬롯"에 ContentPresenter을 사용하고 ContentTemplateSelector 속성을 사용하여 사용할 템플릿 선택기를 정의 할 수 있습니다.

0

나는 가능한 각 '보기'에 대한 사용자 정의 사용자 컨트롤을 만듭니다.

가시성이 C#, thou를 사용하여 변경되었습니다. 약간의 코딩이 필요했습니다.

이 접근법의 주된 이유는 개발 용이성입니다. 설계자는 거기에있을 모든 가능한 컨트롤 세트가 아닌 특정보기에 초점을 맞 춥니 다.

관련 문제