【问题标题】:Xamarin Forms Access ViewModel Property in XAMLXamarin 表单访问 XAML 中的 ViewModel 属性
【发布时间】:2019-04-02 23:14:57
【问题描述】:

如何在 XAML 中访问我的 ViewModel 的属性?

我只在 ListView 选择了一个项目时才尝试启用按钮。所选项目是绑定到我的 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>

【问题讨论】:

  • 你试过“{Binding SelectedCar}”吗?
  • 它就在提供的代码中?

标签: listview xamarin.forms selecteditem


【解决方案1】:

您应该使用converter(实现 IValueConverter 的类),因为您有数据但需要绑定到另一种格式的属性,您有一个可以有值的对象(不同于 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();
        }
    }

然后您可以在代码中使用该转换器:

<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

【讨论】:

  • 在上面的转换中,你的意思是 value != null 对吗?没有输入。此外,您在 StackLayout.Resources 中添加的“conv”在哪里?
  • 哦,你是对的,对不起。我现在只有一个记事本:)
  • conv: 是您放置转换器的命名空间,您需要导入才能在 XAML 中使用它
  • 这将按照您的建议启用按钮,谢谢。但是现在列表视图中的选择仍然存在。如何清除该选择以使该按钮再次被禁用?谢谢
  • 还没有弄清楚最后一点,但感谢您的回答和帮助,耶稣!
猜你喜欢
  • 2017-01-18
  • 2018-06-03
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多