2011-02-16 2 views
2

메뉴 항목을 만들고 싶지만 표시되는 텍스트는보기 모델의 속성에 따라 다릅니다. IsPlaying 속성이 true이면 MenuItem 텍스트는 "일시 중지"여야하며 그렇지 않으면 "재생"이어야합니다.일부 바운드 데이터에서 WPF 컨텐트를 조건부로 만드는 방법은 무엇입니까?

<MenuItem Header="_Play" Command="{Binding Path=PlayCommand}" /> 

그러나, "재생"과 교환해야한다 "일시 정지"(가능한 PlayCommand 너무 PauseCommand로 교환하는 경우는, 그러나 이것은에 의해 작동 될 수있다 :이 조건없이

의 MenuItem에 뭔가 같이해야한다 PlayCommand 및 PlayCommand의 PauseCommand 논리를 모두 가지고 있음)

답변

3

이 작업을 수행하는 가장 간단한 방법은 먼저 플레이를 반환 또는 IsPlaying의 값을 기준으로하고 INotifyPropertyChanged을 구현 일시 중지 당신의 ViewModel에 string Caption 속성에 Header을 바인드해야합니다. 이 후 IsPlaying이 변경된 경우에도 Caption에 대한 변경 알림을 전송하십시오.

하지만 변환기를 사용할 수는 있지만이 경우 잔인합니다.

+0

나는 처음으로 변환기 응답을 투표했지만, 나는 결국이 질문에 답변 할 것이라고 생각한다.조금 덜 "예쁜"것이지만 문제의 상대적인 단순성을 여기에서 볼 때이 솔루션은 아마도 가장 쉽고 빠른 것일 것입니다. – David

1

가장 좋은 것은 변환기입니다.

<UserControl xmlns:myConverters="MyRandomNamespace"> 
    <UserControl.Resources> 
     <myConverters:MyMenuTextConverter x:Key="MyMenuTextConverter" /> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot"> 
     <TextBlock Text="{Binding IsPlaying, Converter={StaticResource MyMenuTextConverter }}" /> 
    </Grid> 

</UserControl> 

을하고 컨버터 : 코드는 다음과 같을 것이다

namespace MyRandomNamespace 
{ 
    public class MyMenuTextConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if ((bool) value == true) 
       return "Pause"; 

      return "Play"; 
     } 
    } 
} 

나는 당신이해야 할 모든이 같은를 사용하고, 바인딩의 뒤에 개념을 표시하는 TextBlock을 사용했습니다 MenuItem의 해당 속성에 대한 바인딩 구문. 나는 또한 최적 (개인적으로 내 텍스트 변환기에서 문자열 응용 프로그램의 문화를 인식 할 수 있도록 문자열 변환기에서 값을 검색하는 것을 좋아한다.) 변환기에서 리터럴 텍스트를 반환하지만 아이디어를 얻는다.

+1

문자열을 변환기로 굽는 또 다른 방법은 변환기에서 TrueText 및 FalseText 속성을 정의한 다음 XAML 변환기 리소스에서 지정할 수 있습니다. 이는 자원 검색 (TrueResourceKey 및 FalseResourceKey)과 결합하여 변환기 코드를 현지화를 손상시키지 않고 재사용 할 수 있습니다. – itowlson

1

이 작업을 수행하는 몇 가지 방법 :

  1. 는 트리거를 사용합니다. 트리거를 IsPlaying = True로 설정하고 Header 및 Command를 각각 Pause 및 PauseCommand로 설정하십시오.
  2. 두 개의 메뉴 항목 (재생 및 일시 중지)이 있고 한 쌍의 트리거를 사용하여 IsPlaying에 따라 가시성을 설정합니다. (당신은 데이터 바인딩 가시성도 할 수 있지만, 트리거를 사용하는 것은 BooleanToInvisibilityConverter를 정의 할 필요를 피할 수 있습니다.) 당신은 당신은이를 사용할 수 있습니다 (귀하의 ViewModel의 상태에 따라 내용을 변경하는 DataTrigger을 사용할 수 있습니다
  3. WPF에서
+0

+1 옵션 1; 그들은 물론 컨버터와 마찬가지로 작동하지만 Trigger는 깨끗하고 동시에 Command 문제를 해결합니다. – kiwipom

1

기법을 사용하여 템플릿을 바꿀 수 있습니다. 또 다른 방법은 VisualStateManager (실버 라이트가 없기 위해 만든 datatriggers의 먼 사촌)을 사용하여 한 상태 (IsPlaying)에서 다음 (! IsPlaying)로 비슷한 변경을 수행하는 것입니다.

더 자세한 예를 들려주고 싶지만 내 취침 시간이 지났습니다. 어쩌면 나중에.

관련 문제