2012-03-27 7 views
13

Mi chiedevo se è possibile nascondere un controllo su una vista se la proprietà a cui è associato il controllo non esiste nel modello di vista. Per esempio, se ho il seguente:MVVM: nasconde un controllo quando la proprietà associata non è presente

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

Posso rilevare in XAML che la proprietà IsQuoted non esiste sul modello vista, e semplicemente nascondere il controllo in quel caso.

Sto essenzialmente creando una finestra di dialogo guidata che si muove attraverso una collezione di modelli di vista, visualizzando la vista associata per ognuno. Per alcuni dei modelli di vista nella raccolta, la proprietà "IsQuoted" sarà presente e, per alcuni, no.

Mi piacerebbe avere una casella di controllo al di fuori di queste viste che viene visualizzata quando il modello di visualizzazione corrente ha la proprietà e si nasconde quando il modello di visualizzazione non lo fa. Tutti i modelli di visualizzazione derivano da una classe base comune, ma preferirei non ingombrare la base aggiungendo una proprietà "ShowQuoted", ecc.

Pensieri? E, grazie in anticipo ...

risposta

36

Gestire il caso in cui il valore è presente utilizzando un convertitore che restituisce sempre Visibilità.Visibile. Gestire il caso in cui il valore non è presente specificando un valore di fallback. Quando la proprietà non è presente, il binding fallisce e riceve il valore di fallback.

<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

Freddo. Sto usando WPF da quattro anni e non ho mai notato la proprietà FallbackValue (o l'ho fatto e non ho prestato attenzione al momento - difficile da dire). Questo potrebbe tornare utile. – MetalMikester

+0

Se si desidera essere più espliciti, è possibile controllare DependencyProperty.UnsetValue http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue%28v=vs.110%29. aspx –