2017-09-26 4 views
2

Ich habe eine Liste von Foo-Objekten in meinem Ansichtsmodell. Jedes Foo-Objekt besitzt eine Eigenschaft, ShouldBeVisible, die in einer Logik basierend auf der Frage, ob dieses Element dem Benutzer angezeigt werden soll, den Wert "true" oder "false" zurückgegeben hat.Sichtbarkeitsbindung basierend auf einer Eigenschaft ändern

Ich habe einen IValueConverter erstellt, der an die ShouldBeVisible-Eigenschaft bindet, um Visibility.Visible und Collapse zurückzugeben.

Alles ist großartig und ich kann nur die Foo-Elemente zeigen, die in meinem StackPanel angezeigt werden sollten.

Ich möchte jetzt ein Kontrollkästchen zu meiner Seite mit der Bezeichnung "Alle anzeigen" hinzufügen, die an eine Eigenschaft in meinem ViewModel binden wird. Wenn es aktiviert ist, möchte ich alle Foo-Elemente anzeigen, egal was ShoulBeVisible sagt, und wenn es nicht aktiviert ist, ShoulBeVisible zu folgen.

Ich bin mir nicht sicher, wie man das richtig bindet, da der IValueConverter nur an ein Element gebunden werden kann.

Gibt es eine Möglichkeit, die Sichtbarkeitsbindung zur Laufzeit basierend zu aktualisieren, ob mein Kontrollkästchen aktiviert ist?

+1

Auf der Änderung der 'ShowAll' gebunden Eigenschaft auf dem VireModel, kann man nicht durch die iterieren Liste von Objekten und markieren Sie alle als 'ShouldBeVisible' entsprechend? – Lindsay

Antwort

0

In WPF könnten Sie IMultiValueConverter verwenden, aber es ist nicht für UWP verfügbar. In diesem Fall können Sie Cimbalino Toolkit verwenden.

auf GitHub ist ein Beispiel mit dieser Funktionalität:

https://github.com/Cimbalino/Cimbalino-Phone-Toolkit/tree/master/samples/MultiBinding/MultiBinding

Installieren in NuGet Pakete: Cimbalino.Toolkit und Microsoft.Xaml.Behaviors.Uwp.Managed.

Unten ist ein vereinfachtes Beispiel. Sie sollten eingehende Parameter in VisibilityConverter überprüfen.

Ausblick:

<Page 
    x:Class="Q46430426.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Q46430426" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:interactivity="using:Microsoft.Xaml.Interactivity" 
    xmlns:behaviors="using:Cimbalino.Toolkit.Behaviors" 
    mc:Ignorable="d" 
    x:Name="page"> 
    <Page.Resources> 
     <local:VisibilityConverter x:Key="VisibilityConverter" /> 
    </Page.Resources> 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <CheckBox IsChecked="{Binding ShowAll, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Content="ShowAll"></CheckBox> 

     <ItemsControl Grid.Row="1" ItemsSource="{Binding Items, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Name="border" Margin="3" BorderThickness="2" BorderBrush="Black"> 
         <interactivity:Interaction.Behaviors> 
          <behaviors:MultiBindingBehavior PropertyName="Visibility" Converter="{StaticResource VisibilityConverter}" > 
           <behaviors:MultiBindingItem Value="{Binding DataContext.ShouldBeVisible, RelativeSource={RelativeSource Mode=TemplatedParent}}"/> 
           <behaviors:MultiBindingItem Value="{Binding DataContext.ShowAll, ElementName=page}"/> 
          </behaviors:MultiBindingBehavior> 
         </interactivity:Interaction.Behaviors> 
         <TextBlock Text="{Binding Name}"></TextBlock> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Page> 

Ansichtsmodell:

public class MainViewModel : ViewModelBase 
{ 
    private bool _showAll; 
    private ObservableCollection<Foo> _items; 

    public MainViewModel() 
    { 
     Items = new ObservableCollection<Foo>() 
    { 
     new Foo(){Name = "Test1", ShouldBeVisible = true}, 
     new Foo(){Name = "Test2", ShouldBeVisible = false}, 
     new Foo(){Name = "Test3", ShouldBeVisible = true}, 
     new Foo(){Name = "Test4", ShouldBeVisible = false}, 
     new Foo(){Name = "Test5", ShouldBeVisible = true}, 
    }; 
    } 

    public ObservableCollection<Foo> Items 
    { 
     get { return _items; } 
     set { _items = value; RaisePropertyChanged(); } 
    } 

    public bool ShowAll 
    { 
     get { return _showAll; } 
     set { _showAll = value; RaisePropertyChanged(); } 
    } 
} 

VisibilityConverter:

public class VisibilityConverter : MultiValueConverterBase 
{ 
    public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var shouldBeVisible = (bool)values[0]; 
     var showAll = (bool)values[1]; 
     if (showAll || shouldBeVisible) return Visibility.Visible; 
     return Visibility.Collapsed; 
    } 

    public override object[] ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
Verwandte Themen