2012-03-27 11 views
13

Zastanawiam się, czy możliwe jest ukrycie kontrolki w widoku, jeśli właściwość, do której kontrolka jest powiązana, nie istnieje w modelu widoku. Na przykład, jeśli mam następujące:MVVM - ukrywanie formantu, gdy właściwość bound nie jest obecna

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

można wykryć w XAML, że nieruchomość IsQuoted nie istnieje na modelu widoku, a po prostu ukryć kontrolę w tej instancji.

W zasadzie tworzę okno dialogowe kreatora, które porusza się przez kolekcję modeli widoków, wyświetlając powiązany widok dla każdego z nich. W przypadku niektórych modeli widoku w kolekcji będzie widoczna właściwość "IsQuoted", a dla niektórych nie.

Chciałbym mieć pole wyboru poza tymi widokami, które wyświetla się, gdy bieżący model widoku ma właściwość i ukrywa się, gdy model widoku nie. Wszystkie modele widoku pochodzą ze wspólnej klasy bazowej, ale wolałbym nie zagracać bazy, dodając właściwość "ShowQuoted", itp.

Myśli? I, z góry dziękuję ...

Odpowiedz

36

Obchodzenie się z walizką, w której obecna jest wartość, za pomocą konwertera, który zawsze zwraca Widoczność. Widoczny. Obsługa przypadku, w którym wartość nie występuje, określając wartość rezerwy. Gdy właściwość nie jest obecna, powiązanie nie powiedzie się i otrzymuje wartość rezerwową.

<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

Cool. Używam WPF przez cztery lata i nigdy nie zauważyłem właściwości FallbackValue (lub zrobiłem i po prostu nie zwracałem uwagi w tym czasie - trudno powiedzieć). To może się przydać. – MetalMikester

+0

Jeśli chcesz uzyskać bardziej jednoznaczne informacje, możesz sprawdzić DependencyProperty.UnsetValue http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue%28v=vs.110%29. aspx –

Powiązane problemy