Как скрыть / показать метку, когда элемент выбран / не выбран в mvvm? - PullRequest
0 голосов
/ 03 августа 2020
• 1000 * виден и скрыт метка 2 и 3, когда в сборщике 2 и 3 нет выбранного элемента

Любая помощь будет принята с благодарностью.

Первая страница

 <Picker SelectedItem="{Binding PICKER1}"  WidthRequest="120" FontSize="10" TextColor="Black" VerticalOptions="Center" BackgroundColor="WhiteSmoke">
      <Picker.Items>
           <x:String>15 cm</x:String>
           <x:String>30 cm</x:String>
           <x:String>45 cm</x:String>
      </Picker.Items>
 </Picker>

Страница 2

 <Picker SelectedItem="{Binding PICKER2}"  WidthRequest="120" FontSize="10" TextColor="Black" VerticalOptions="Center" BackgroundColor="WhiteSmoke">
      <Picker.Items>
           <x:String>hello</x:String>
           <x:String>hi</x:String>
           <x:String>ciao</x:String>
       </Picker.Items>
 </Picker>

Страница 3

 <Picker SelectedItem="{Binding PICKER3}"  WidthRequest="120" FontSize="10" TextColor="Black" VerticalOptions="Center" BackgroundColor="WhiteSmoke">
       <Picker.Items>
           <x:String>when</x:String>
           <x:String>how</x:String>
      </Picker.Items>
 </Picker>

Страница 4

 <Label x:Name="lab11" Text="{Binding DisplayPICKER1}"  Margin="10" Grid.Column="1" Grid.Row="0" FontSize="10" HorizontalOptions="StartAndExpand"  VerticalOptions="CenterAndExpand"></Label>
 <Label x:Name="lab2" Text="{Binding DisplayPICKER2}"  Margin="10" Grid.Column="1" Grid.Row="0" FontSize="10" HorizontalOptions="StartAndExpand"  VerticalOptions="CenterAndExpand"></Label>
 <Label x:Name="lab3" Text="{Binding DisplayPICKER3}"  Margin="10" Grid.Column="1" Grid.Row="0" FontSize="10" HorizontalOptions="StartAndExpand"  VerticalOptions="CenterAndExpand"></Label>
                  

Mainviewmodel

 string picker1 = string.Empty;
 public string PICKER1
 {
      get => picker1;
      set
      {
           if (picker1 == value)
                return;
           else
           {
               picker1 = value;
               OnPropertyChanged(nameof(PICKER1));
               OnPropertyChanged(nameof(DisplayPICKER1));
           }
      }
 }
 public string DisplayPICKER1 => $"distance: {PICKER1}";


 string picker2 = string.Empty;
 public string PICKER2
 {
      get => picker2;
      set
      {
           if (picker2 == value)
                return;
           else
           {
                picker2 = value;
                OnPropertyChanged(nameof(PICKER2));
                OnPropertyChanged(nameof(DisplayPICKER2));
           }
      }
 }
 public string DisplayPICKER2 => $"Greet: {PICKER2}";


 string picker3 = string.Empty;
 public string PICKER3
 {
      get => picker3;
      set
      {
           if (picker3 == value)
                return;
           else
           {
                picker3 = value;
                OnPropertyChanged(nameof(PICKER3));
                OnPropertyChanged(nameof(DisplayPICKER3));
           }
      }
 }
 public string DisplayPICKER3 => $"{PICKER3}";

1 Ответ

0 голосов
/ 03 августа 2020

Предполагается, что свойства Picker1, Picker2 и Picker3 выбраны и не выбраны, как ожидалось; например, Label1 ниже не будет отображаться, если выбраны оба Picker1 и Picker2:

Используйте свойство Label IsVisible, определите IMultiValueConverter и используйте это с помощью MultiBinding:

<ContentPage 
  ...
  xmlns:converters="clr-namespace:Converters">

<ContentPage.Resources>
  <converters:AllTrueMultiConverter x:Key="AllTrueMultiConverter"/>
  <converters:IsSelectedConverter x:Key="IsSelectedConverter"/>
  <converters:NotSelectedConverter x:Key="NotSelectedConverter"/>
</ContentPage.Resources>

<ContentPage.Content>
  ...
  <Label Text="Label1 MultiBinding">
    <Label.IsVisible>
      <MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
        <Binding Path="Picker1" Converter="{StaticResource IsSelectedConverter}" />
        <Binding Path="Picker2" Converter="{StaticResource NotSelectedConverter}" />
        <Binding Path="Picker3" Converter="{StaticResource NotSelectedConverter}" />
      </MultiBinding>
    </Label.IsVisible>
  </Label>

Для AllTrueMultiConverter см. Определите IMultiValueConverter

Пример IsSelectedConverter и NotSelectedConverter:

namespace Converters
{
  public class IsSelectedConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value != null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
  }
  ...
  public class NotSelectedConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
  }
}

Если Label1 должно быть видно только в зависимости от Picker1, можно использовать Binding:

<Label Text="Label1 Binding" IsVisible="{Binding Picker1, Converter={StaticResource IsSelectedConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...