UI의 특정 "슬롯"에서 UIElement
을 동적으로 교환하는 가장 작은 방법은 무엇입니까? 숫자가 UIElement
이고 외부 데이터 바인딩 (예 : 콤보 상자 선택)에 따라 그 중 하나가 표시되고 현재 표시되어있는 것이 숨겨지기를 원합니다. 따라서이 동작은 TabControl
과 비슷하지만 탭과 크롬 및 tabitem 인스턴스가 없습니다. 그래서 실제로는 TabControl
을 사용하고 컨트롤 템플릿을 재정의 할 수 있습니다. 그러나 이것이 실제로 가장 최소한의 접근입니까?WPF에서 UIElement를 교환하는 컨트롤
답변
몇 가지 옵션이 있습니다. 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
에 요소를 바인딩 : 다음 Converter
에 ComboBox.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
을 재사용 할 수 있습니다 (많은 요소가있는 경우 데이터 템플릿 선택기 방식이 더 바람직합니다).
[면책 조항 : 위의 코드는 테스트하지 메모리로부터 해시되었다 - 조금 조정이 필요할 수 있습니다]
<ContentControl Content="{Binding SomePropertyThatYieldsTheContent}"/>
나는 그것이 서로의 상단에있는 요소를 레이어 필요에 따라 프로그래밍 방식으로 다시 축소에 가시에서 자신의 가시성 속성을 변경하는 것입니다 방법.
우리 디자이너는 C#을 잘하지는 않지만 UI를 정의하는 디자이너입니다. – bitbonk
이 가장 간결한 방법입니다 경우 나도 몰라,하지만 당신은 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>
...
이 방법은 몇 가지 "모드"만있는 경우 매우 효과적입니다. "편집"모드와 "읽기 전용"모드가 있습니다. 가시성을 숨김 또는 숨김으로 설정하고 동일한 격자 셀에 여러 요소가 있으므로 모드 변경 중에 다른 UI 요소가 바뀌지 않습니다. –
Data Template Selectors을 보면, Bea Stollnitz의 게시물은 here입니다. 기본적으로 각 UI "슬롯"에 ContentPresenter
을 사용하고 ContentTemplateSelector
속성을 사용하여 사용할 템플릿 선택기를 정의 할 수 있습니다.
나는 가능한 각 '보기'에 대한 사용자 정의 사용자 컨트롤을 만듭니다.
가시성이 C#, thou를 사용하여 변경되었습니다. 약간의 코딩이 필요했습니다.
이 접근법의 주된 이유는 개발 용이성입니다. 설계자는 거기에있을 모든 가능한 컨트롤 세트가 아닌 특정보기에 초점을 맞 춥니 다.
http://stackoverflow.com/questions/1287995에 대한 답변을 바탕으로 ContentPresenter가 더 나은 선택 일 것이라고 생각합니다. – Wilka