2012-03-27 2 views
13

컨트롤이 바인딩 된 속성이 뷰 모델에 존재하지 않으면보기에서 컨트롤을 숨길 수 있는지 궁금합니다. 예를 들어, 내가 가지고있는 경우 다음MVVM - 바운드 속성이 없을 때 컨트롤 숨기기

<CheckBox Content="Quote" 
      IsChecked="{Binding Path=IsQuoted}" /> 

내가 IsQuoted 속성은 뷰 모델에 존재하며, 단순히 인스턴스의 컨트롤을 숨기하지 않는 XAML에서 감지 할 수 있습니다.

본질적으로 뷰 모델 컬렉션을 통해 이동하는 마법사 대화 상자를 만들어서 각각에 대한 관련 뷰를 표시합니다. 컬렉션의 일부 뷰 모델의 경우 "IsQuoted"속성이 제공되고 일부는 표시되지 않습니다.

현재 뷰 모델에 속성이있을 때 표시되는 이러한 뷰 외부의 확인란을 사용하고 뷰 모델이 표시되지 않을 때 숨 깁니다. 모든 뷰 모델은 공통 기본 클래스에서 파생되지만 "ShowQuoted"속성 등을 추가하여베이스를 복잡하게 만들지는 않을 것입니다.

생각 하시겠습니까? 그리고 사전에 감사드립니다 ...

답변

36

항상 Visibility.Visible을 반환하는 변환기를 사용하여 값이있는 경우를 처리합니다. 대체 값을 지정하여 값이없는 경우를 처리하십시오. 속성이 없으면 바인딩이 실패하고 폴백 값을받습니다.

<Page.DataContext> 
    <Samples:OptionalPropertyViewModel/> 
</Page.DataContext> 
<Grid> 
    <Grid.Resources> 
     <Samples:AlwaysVisibleConverter x:Key="AlwaysVisibleConverter" /> 
    </Grid.Resources> 
    <CheckBox 
     Content="Is quoted" 
     IsChecked="{Binding IsQuoted}" 
     Visibility="{Binding IsQuoted, 
        Converter={StaticResource AlwaysVisibleConverter}, 
        FallbackValue=Collapsed}" 
     /> 
</Grid> 

public class OptionalPropertyViewModel 
{ 
    public bool IsQuoted { get; set; } 
} 

public class AlwaysVisibleConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

    public object Convert(object value, 
          Type targetType, object parameter, CultureInfo culture) 
    { 
     return Visibility.Visible; 
    } 

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

    #endregion 
} 
+2

차갑다. 저는 WPF를 4 년 동안 사용해 왔고 FallbackValue 속성을 발견하지 못했습니다. (또는 그 때주의를 기울이지 않았습니다. 이것은 유용 할 수 있습니다. – MetalMikester

+0

좀 더 명확하게 나타내려면 DependencyProperty.UnsetValue http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue%28v=vs.110%29를 확인할 수 있습니다. aspx –

관련 문제