2011-09-27 2 views
12

IEnumerable <에 포함 된 개체 목록이 있습니다. 이 목록의 개수를 기반으로 컨트롤의 가시성을 설정하고 싶습니다. 나는 시도했다 :IEnumerable의 'Count'에 대한 컨트롤의 가시성 바인딩

Visibility="{Binding MyList.Count>0?Collapsed:Visible, Mode=OneWay}" 

그러나 이것은 작동하지 않는다. 나는 카운트 값이 맞는지 확인하기 위해 텍스트 블록의 텍스트에 바인딩 MyList.Count를 시도했다. 가시성을 올바르게 설정하지 않은 것처럼 보입니다.

+0

당신이 이것을 사용할 수있는 것처럼 보입니다 : http://www.11011.net/wpf-binding-expressions – Gabe

답변

28

바인딩에 논리적 또는 코드 식을 사용할 수 없습니다 (PropertyPath이 필요함). 어느 내가 어떻게 할 것인지 인하는 converter 또는 트리거를 사용합니다. (원하는 경우는 당연히 resource에 스타일을 리팩토링 수)

<YourControl.Style>      
    <Style TargetType="YourControl"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding MyList.Count}" Value="0"> 
       <Setter Property="Visibility" Value="Visible" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</YourControl.Style> 

+0

고맙습니다. 이걸 리소스 요소로 리팩터링하여 어떻게 전달할 수 있는지 알고 싶습니다. 차이 목록에서 매개 변수로? – BKSpurgeon

+0

@BKSpurgeon : 데이터 컨텍스트의 속성이 동일하지 않은 경우에는 어렵습니다. 불행히도 바인딩은 다소 정적입니다. 옵션을 사용하면 경로가 다양한 데이터 컨텍스트와 작동하도록 컨벤션을 만들 수 있습니다. 인터페이스는 데이터 컨텍스트가 구현된다는 것을 말하며 항상 동일한 이름을 가진 목록 속성을 제공합니다. –

+0

@BKSpurgeon : 마크 업 확장을 사용하여 바인딩 경로를 다소 동적으로 구성 할 수있는 옵션이 있지만 응용 프로그램이 아닌 스타일 작성시에 실행되어 아마 아무 것도 유도하지 않을 것입니다. –

0

Count 속성을 Visibility 값으로 변환하거나 "HasItems"부울 속성을 Visibility 값으로 변환하는 변환기를 사용해야합니다. 우리는 이와 같은 작업을 처리하기 위해 boolToVisibilityConvert와 같은 것을 사용합니다.

필자에게 필요한 경우보다 정확한 세부 정보를 제공 할 수 있습니다.

2

이 세 가지 방법이다 :

  1. HB에서 언급 한 트리거
  2. 클래스에서 IValueConverter를 구현하고 Binding의 Converter 속성을 해당 클래스의 IValueConverter 인스턴스로 설정하여 변환기를 사용하려면
  3. Visibility 상태를 직접 반환하도록 ViewModel의 속성을 정의해야합니다.

항상 트리거 방법을 사용할 수 있으며 항상 좋은 접근 방법입니다. 세 번째 방법은 MVVM 패턴을 사용할 때 유용하며 (그리고 가장 좋습니다) ViewModel에서 UI 관련 어셈블리를 참조하는 것을 제한하지 않습니다. 트리거를 사용하는 것이 좋지만 xaml을 더티하게 만들지 않으려면 많은 마크 업 코드는 변환기를 사용합니다.

관련 문제