Listview Xamarin表单访问XAML中的ViewModel属性

Listview Xamarin表单访问XAML中的ViewModel属性,listview,xamarin.forms,selecteditem,Listview,Xamarin.forms,Selecteditem,如何在XAML中访问ViewModel的属性 我试图仅在ListView选中某个项目时启用按钮。所选项目是绑定到my ViewModel中SelectedCar的数据。现在,我想检查SelectedCar是否为空,如果为空,则禁用按钮;否则,请启用它 我试过这样的东西 <StackLayout Orientation="Vertical"> <ListView x:Name="lvwCars" ItemsSource="{Binding Cars}"

如何在XAML中访问ViewModel的属性

我试图仅在ListView选中某个项目时启用按钮。所选项目是绑定到my ViewModel中SelectedCar的数据。现在,我想检查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>

您应该使用
转换器(实现IValueConverter的类),因为您有数据,但需要绑定到另一种格式的属性,您有一个对象可以有值(不同于null)或为null,因此,您需要实现如下转换器:

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();
        }
    }
xmlns:conv="clr-namespace:CarsMobile.Converters;assembly=CarsMobile"
然后,您可以在代码中使用该转换器:

<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>
例如,如果您的项目是CarsMobile,并且您有
CarsMobile、CarsMobile.Droid和CarsMobile.iOS,
,并且您将转换器类放在名为
Converters
(CarsMobile\Converters\ObjectToBoolConverter)的文件夹中,那么您的XMLN应该如下所示:

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();
        }
    }
xmlns:conv="clr-namespace:CarsMobile.Converters;assembly=CarsMobile"
参考


您是否尝试过“{Binding SelectedCar}”?它就在提供的代码中?在上面的Convert中,您是指值!=零对吗?没有输入。还有,你在StackLayout.Resources中添加的“conv”comming在哪里?哦,你说得对,对不起。我现在只有一个记事本:)
conv:
是放置转换器的名称空间,需要导入才能在XAML中使用它。这将按照您的建议启用按钮,谢谢。但现在列表视图中的选择保持不变。如何清除该选项,使该按钮再次被禁用?谢天谢地,我还没想到最后一点,但是谢谢你的回答和大部分的帮助,耶稣!