2010-06-25 8 views
4

기본적으로 화면의 한 부분에 "인증"상자가 있어야합니다. 여기서 로그인 한 경우 사용자 이름과 "사용자 전환"버튼이 표시되지만 로그인하지 않은 경우에는 로그인 버튼을 표시합니다.WPF의 조건에 따라 다른 컨트롤을 표시하는 방법은 무엇입니까?

완전히 다른 컨트롤을 두 개씩 화면에 배치하고 해당 가시성 속성을 IsAuthenticated에 바인딩 할 수 있지만 더 나은 방법을 찾기 위해 몇 가지 좋은 제안이 있었으면합니다.

감사

답변

8

가시성 바인딩을 언급 했으므로 비슷한 문제를 해결하기 위해 내가 한 것을 보여줄 것입니다. 당신의 App.xaml에서

당신이 간단하게이 작업을 수행 할 수있는 뷰 모델의 부울 속성을 통해 가시성을 제어하려는 모든 제어를 위해

<Application.Resources> 
    <BooleanToVisibilityConverter x:Key="VisibilityOfBool" /> 
</Application.Resources> 

을 넣어.
Visibility="{Binding IsEditable, Converter={StaticResource VisibilityOfBool}}" 

IsEditable에 기초하여 상기 제어부의 표시를 전환한다.

+0

BooleanToVisibilityConverter ... 너무 멋지다. – mdisibio

3

이 별도의 컨트롤을 가지고 귀하의 옵션은 실제로 내 첫 번째 선택이 될 것입니다.

이것은 두 컨트롤을 철저하고 손쉽게 테스트 할 수있는 이점이 있습니다. 트리거를 사용하면 DataContext의 기준에 따라 표시되는 컨트롤을 쉽게 전환 할 수 있습니다. 그것은 깨끗하고 단순하며 합리적으로 우아합니다.

이 문제를 피하려면 다른 옵션이 있습니다.

예를 들어, 해당 "상자"영역에 ContentPresenter을 사용하고 해당 내용을 단순히 "개체"로 정의 된 DataContext의 속성에 바인딩 할 수 있습니다. 그런 다음 런타임에이를 인증 할 때와 인증하지 않을 때를 별도의 유형으로 설정할 수 있습니다. 각 형식에 대해 DataTemplate을 지정하면 WPF가 자동으로 적절한 컨트롤을 연결합니다. (이것은 기본적으로 ViewModel-first MVVM 스타일 방식입니다.)

+0

MVVM을 사용하고있어서 아마도 두 번째 경로가 가장 좋습니다. –

+0

@Max : MVVM에서도 여전히 첫 번째 경로를 사용합니다. 두 번째 경로의 유일한 장점은 사용자가 인증 될 때까지 인증 정보 (해당 "창"의 ViewModel)를로드 할 필요가 없다는 것입니다. 첫 번째 방법에서는 null이더라도 무언가가 필요합니다. 두 가지 방법 모두 잘 작동합니다. –

+1

나는 또한 첫 번째 접근법을 더 좋아한다. 그러나 "보이지 않는"컨트롤에서 바인딩이 변경되면 "보이는"컨트롤 (또는 아래의 ViewModel)이 어떻게 동작하는지에 영향을 미치지 않도록주의를 기울여야합니다. –

관련 문제