2012-03-27 15 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 –

関連する問題