Xamarin Forms Access Свойство ViewModel в XAML - PullRequest
0 голосов
/ 30 октября 2018

Как получить доступ к свойству моей ViewModel в XAML?

Я пытаюсь включить кнопку, только если в ListView выбран элемент. Выбранный элемент данных привязан к SelectedCar в моей ViewModel. Теперь я хочу проверить, является ли SelectedCar нулевым, и если это так, отключить кнопку; в противном случае включите его.

Я пробовал что-то вроде этого

<StackLayout Orientation="Vertical">   
    <ListView x:Name="lvwCars" ItemsSource="{Binding Cars}"
      SelectedItem="{Binding SelectedCar}">
     <ListView.ItemTemplate>
      <DataTemplate>
       <ViewCell>
        <StackLayout Orientation="Horizontal">
         <Label Text="{Binding PlateNumber}" />
         <Label Text="{Binding OwnerName}" />    
        </StackLayout>
       </ViewCell>
      </DataTemplate>
     </ListView.ItemTemplate>
    </ListView>
</StackLayout>

<StackLayout Orientation="Horizontal"> 
    <Button x:Name="btnBack" 
            Text="Back" 
            Command="{Binding BackClickCommand}"/>
    <Button x:Name="btnNext" 
            Text="Next" 
            IsEnabled="False"
            Command="{Binding ConfirmClickCommand}">
     <Button.Triggers>
      <DataTrigger TargetType="Button" 
       Binding="{Binding Source={x:Reference MyCarsViewModel}, Path=SelectedCarProperty}" Value="null">
       <Setter Property="IsEnabled" Value="False"/>
      </DataTrigger>
     </Button.Triggers>
    </Button>
</StackLayout>

1 Ответ

0 голосов
/ 30 октября 2018

Вы должны использовать converter (класс, который реализует IValueConverter), потому что у вас есть данные, но вам нужно привязать свойство к другому формату, у вас есть объект, который может иметь значение (отличное от нуля) или быть нулевым, поэтому вам нужно реализовать конвертер так:

public class ObjectToBoolConverter : 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)
        {
            throw new NotImplementedException();
        }
    }

Тогда вы можете использовать этот конвертер в вашем коде:

<StackLayout Orientation="Horizontal"> 
<StackLayout.Resources>
  <conv:ObjectToBoolConverter x:Key="Null2bool" />
</StackLayout.Resources>    
<Button x:Name="btnBack" 
            Text="Back" 
            Command="{Binding BackClickCommand}"/>
    <Button x:Name="btnNext" 
            Text="Next" 
            IsEnabled="{Binding SelectedCar,Converter={StaticResource Null2bool}}"
            Command="{Binding ConfirmClickCommand}">
    </Button>
</StackLayout>

Не забудьте импортировать пространство имен вашего конвертера для использования в XAML

В этом примере я использовал conv: в качестве псевдонима, поэтому вам нужно поместить это в объявление вашей страницы сверху:

xmlns:conv="clr-namespace:Your.Converter.Namespace;assembly=Your.Assembly.Name"

Например, если ваш проект CarsMobile, и у вас есть CarsMobile, CarsMobile.Droid and CarsMobile.iOS,, и вы поместили свой класс конвертера в папку с именем Converters ( CarsMobile \ Converters \ ObjectToBoolConverter ), чтобы ваши xmlns должны были выглядеть так это:

xmlns:conv="clr-namespace:CarsMobile.Converters;assembly=CarsMobile"

Ссылка https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters

...