2017-03-06 51 views
1

我有一个订单状态属性是一个枚举,我想改变基于枚举值显示XAML。XAML基于枚举 - Xamarin形式

这可能吗?

这是我的XAML用我所有的布局我已经工作(一些被注释掉):

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps" 
    x:Class="Divco.OrderPage" 
    Title="Order"> 
<ContentPage.BindingContext> 
</ContentPage.BindingContext> 
<ContentPage.Content> 
    <!-- Basic stack layout used in all order views --> 
    <StackLayout> 
     <!--<StackLayout.Style>--> 
      <!-- Needs Driver --> 
      <!--<StackLayout> 
       <maps:Map WidthRequest="320" HeightRequest="150" 
        x:Name="WaitingMap" 
        IsShowingUser="false" 
        MapType="Street" /> 
      </StackLayout> 
      <StackLayout Padding="20, 0, 20, 0"> 
       <Label Text="{Binding CurrentOrder.Description}" LineBreakMode="WordWrap" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="Pickup" TextColor="Fuchsia" Font="Bold,14" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupContact.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupAddress.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupTimeFormatted}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="Dropoff" TextColor="Fuchsia" Font="Bold,14" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffContact.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffAddress.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffTimeFormatted}" Font="12" HorizontalTextAlignment="Center" /> 
      </StackLayout> 
      <StackLayout VerticalOptions="EndAndExpand" Padding="20, 0, 20, 20"> 
       <Button Text="Navigate!" 
         BackgroundColor="Fuschia" 
         TextColor="White" 
         Font="Bold,20" 
         Grid.Row="0" Grid.Column="1" /> 
      </StackLayout>--> 

      <!-- Waiting Driver --> 
      <!--<StackLayout> 
       <maps:Map WidthRequest="320" HeightRequest="200" 
        x:Name="WaitingMap" 
        IsShowingUser="true" 
        MapType="Street" /> 
      </StackLayout> 
      <StackLayout VerticalOptions="CenterAndExpand" Padding="20, 0, 20, 0" > 
       <Label Text="Pickup" TextColor="Fuchsia" Font="Bold" /> 
       <Label Text="{Binding CurrentOrder.PickupContact.Display}"/> 
       <Label Text="{Binding CurrentOrder.PickupAddress.Display}"/> 
       <Label Text="{Binding CurrentOrder.PickupTimeFormatted}"/> 
      </StackLayout> 
      <StackLayout VerticalOptions="EndAndExpand" Padding="20, 0, 20, 20"> 
       <Grid> 
        <Grid.RowDefinitions> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Button Text="Navigate" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="0"/> 
        <Button Text="Call" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="1"/> 
       </Grid> 
       <Button Text="I'm here!" 
          BackgroundColor="Fuschia" 
          TextColor="White" 
          Font="Bold,20" /> 
      </StackLayout>--> 

      <!-- Intransit --> 
      <!--<StackLayout> 
       <maps:Map WidthRequest="320" HeightRequest="200" 
        x:Name="TransitMap" 
        IsShowingUser="true" 
        MapType="Street" /> 
      </StackLayout> 
      <StackLayout VerticalOptions="CenterAndExpand" Padding="20, 0, 20, 0" > 
       <Label Text="Dropoff" TextColor="Fuchsia" Font="Bold" /> 
       <Label Text="{Binding CurrentOrder.DropoffContact.Display}"/> 
       <Label Text="{Binding CurrentOrder.DropoffAddress.Display}"/> 
       <Label Text="{Binding CurrentOrder.DropoffTimeFormatted}"/> 
      </StackLayout> 
      <StackLayout VerticalOptions="EndAndExpand" Padding="20, 0, 20, 20"> 
       <Grid> 
        <Grid.RowDefinitions> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Button Text="Navigate" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="0"/> 
        <Button Text="Call" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="1"/> 
       </Grid> 
       <Button Text="I'm here!" 
          BackgroundColor="Fuschia" 
          TextColor="White" 
          Font="Bold,20" /> 
      </StackLayout>--> 

      <!-- Needs Signature --> 
      <!--<StackLayout VerticalOptions="CenterAndExpand" Padding="20, 20, 20, 20"> 
       <Label Text="In order to verify the identity of the signature, please take a photo of the recipient's ID." HorizontalTextAlignment="Center"/> 
       <Button Text="Take Picture" 
        BackgroundColor="Gray" 
        TextColor="White" 
        Font="Bold,20"/> 
       <Button Text="Sign" 
        BackgroundColor="Fuschia" 
        TextColor="White" 
        Font="Bold,20" IsEnabled="false"/> 
      </StackLayout>--> 

      <!-- Complete! --> 
      <StackLayout> 
       <maps:Map WidthRequest="320" HeightRequest="150" 
        x:Name="WaitingMap" 
        IsShowingUser="false" 
        MapType="Street" /> 
      </StackLayout> 
      <StackLayout Padding="20, 0, 20, 0"> 
       <Label Text="{Binding CurrentOrder.Description}" LineBreakMode="WordWrap" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="Pickup" TextColor="Fuchsia" Font="Bold,14" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupContact.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupAddress.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.PickupTimeFormatted}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="Dropoff" TextColor="Fuchsia" Font="Bold,14" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffContact.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffAddress.Display}" Font="12" HorizontalTextAlignment="Center" /> 
       <Label Text="{Binding CurrentOrder.DropoffTimeFormatted}" Font="12" HorizontalTextAlignment="Center" /> 
      </StackLayout> 
      <StackLayout VerticalOptions="EndAndExpand" Padding="20, 0, 20, 20"> 
       <Label Text="This order is complete! Great work!" HorizontalTextAlignment="Center" TextColor="Fuchsia" Font="Bold"/> 
      </StackLayout> 
     <!--</StackLayout.Style>--> 
    </StackLayout> 
</ContentPage.Content> 

因此,举例来说,我想以下时显示订单状态是 “在途”:

<!-- Intransit --> 
      <!--<StackLayout> 
       <maps:Map WidthRequest="320" HeightRequest="200" 
        x:Name="TransitMap" 
        IsShowingUser="true" 
        MapType="Street" /> 
      </StackLayout> 
      <StackLayout VerticalOptions="CenterAndExpand" Padding="20, 0, 20, 0" > 
       <Label Text="Dropoff" TextColor="Fuchsia" Font="Bold" /> 
       <Label Text="{Binding CurrentOrder.DropoffContact.Display}"/> 
       <Label Text="{Binding CurrentOrder.DropoffAddress.Display}"/> 
       <Label Text="{Binding CurrentOrder.DropoffTimeFormatted}"/> 
      </StackLayout> 
      <StackLayout VerticalOptions="EndAndExpand" Padding="20, 0, 20, 20"> 
       <Grid> 
        <Grid.RowDefinitions> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Button Text="Navigate" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="0"/> 
        <Button Text="Call" 
          BackgroundColor="Gray" 
          TextColor="White" 
          Font="Bold" 
          Grid.Row="0" Grid.Column="1"/> 
       </Grid> 
       <Button Text="I'm here!" 
          BackgroundColor="Fuschia" 
          TextColor="White" 
          Font="Bold,20" /> 
      </StackLayout>--> 

VS时的顺序是 “完全” 以下

下面是Order类供参考:

public class Order : INotifyPropertyChanged 
{ 

    // event to handle changes in the order status 
    public event PropertyChangedEventHandler PropertyChanged; 

    public enum Status { Preview, NeedsDriver, WaitingDriver, InTransit, NeedsSignature, Complete, Refunded } 

    public string ID { get; set; } 
    public string Description { get; set; } 
    private Status _orderStatus; 
    public Status OrderStatus { 
     get 
     { 
      return _orderStatus; 
     } 
     set 
     { 
      _orderStatus = value; 
      // tell the view that the order status has changed 
      OnPropertyChanged("OrderStatus"); 
     } 
    } 
    public Contact PickupContact { get; set; } 
    public Contact DropoffContact { get; set; } 
    public Address PickupAddress { get; set; } 
    public Address DropoffAddress { get; set; } 
    public DateTime PickupTime { get; set; } 
    public DateTime DropoffTime { get; set; } 

    // Formatted Pickup and Dropoff Times 
    public string PickupTimeFormatted 
    { 
     get { return PickupTime.ToString("g"); } 
    } 
    public string DropoffTimeFormatted 
    { 
     get { return DropoffTime.ToString("g"); } 
    } 

    public Order() 
    { 
    } 

    // Handler to tell the view that the order status has changed 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    public override string ToString() 
    { 
     return string.Format("[Order: ID={0}, Description={1}, OrderStatus={2}, PickupContact={3}, DropoffContact={4}, PickupAddress={5}, DropoffAddress={6}, PickupTime={7}, DropoffTime={8}, PickupTimeFormatted={9}, DropoffTimeFormatted={10}]", ID, Description, OrderStatus, PickupContact, DropoffContact, PickupAddress, DropoffAddress, PickupTime, DropoffTime, PickupTimeFormatted, DropoffTimeFormatted); 
    } 
} 

回答

0

所以你要显示取决于枚举值的UI的部分在你的视图模型?

有多种方式做到这一点,这里有几个:

  1. 把所有可能的值在容器(Grid,一个StackLayout,一个AbsoluteLayout并使用他们的IsVisible属性绑定到枚举转换器,将您的枚举值转换为truefalse
  2. 同,但使用DataTrigger,无需任何转换。这需要移动Order枚举出班级为XAML中的Ca不引用嵌套类型,并限定自定义xmlns(在下面的例子中“yourNs”):
<!-- InTransit --> 
<StackLayout IsVisible="false"...> 
    <StackLayout.Triggers> 
    <DataTrigger TargetType="VisualElement" Binding="{Binding OrderStatus}" Value="{x:Static yourNs:Status.InTransit}"> 
     <Setter Property="IsVisible" Value="true" /> 
    </DataTrigger> 
    </StackLayout.Triggers> 
    ... 
</StackLayout> 

<!-- Complete --> 
<StackLayout IsVisible="false"> 
    <StackLayout.Triggers> 
    <DataTrigger TargetType="VisualElement" Binding="{Binding OrderStatus}" Value="{x:Static yourNs:Status.Complete}"> 
     <Setter Property="IsVisible" Value="true" /> 
    </DataTrigger> 
    </StackLayout.Triggers> 
    ... 
</StackLayout> 
  • 如果有多个状态,和每个视图是复杂的,1.2。将会创建一个巨大的Xaml,即使某些部分不可见,Xaml仍会被解析并创建对等对象。最好的选择是为每个案例定义一个Xaml视图,并根据枚举值,将正确的实例设置为视图内容,使用后面的代码或者如果您坚持要将所有内容都转到Xaml中,请使用代码或DataTemplateSelector
  • 0

    我承担enum是你想显示的是那些:

    <Label Text="{Binding CurrentOrder.DropoffContact.Display}" .../> 
    

    enumDropoffContact。如果我错了,请纠正我。

    在这种情况下,Label会显示“显示”,因为它是enum值(相当于你用ToString()有什么)的string表示。

    如果您想要自定义Binding中的enum值所显示的文本,可以使用转换器,例如,像这样:

    public class MyEnumConverter : IValueConverter 
    { 
        public object ConvertTo (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         if (!(value is DropoffContact)) 
          return value; 
         switch (DropoffContact)value) { 
         case DropoffContact.Display: 
          return "Some string representation" 
         default: 
          return value; 
         } 
        } 
    
        public void ConvertFrom (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         thrown new NotImplementedException(); 
        } 
    } 
    

    该转换器添加到您的XAML页面资源,并用它在结合:

    <Label Text="{Binding CurrentOrder.DropoffContact.Display, Converter={StaticResource myResourceKey}}" .../> 
    
    +0

    感谢您的回复,我更新了我的问题,希望澄清我所问的内容。我希望这有帮助。 –