2017-11-22 8 views
2

私はXamarinフォームアプリケーションを開発中です。私はGrdiview backgroudの色をプロパティの条件に基づいて設定したかったのです。XamarのXamlの3進演算子

クラスファイルに新しいプロパティを作成してからxamlにバインドすることはできますが、Xaml自体には3値条件を使用する方法があります。

私のコードは

<Grid Margin="5,0,5,5" Padding="10" BackgroundColor="White"> 

プロパティIsRead(ヌル可能ブール)を有しているモデルに結合され、このグリッドです。今度は、IsReadがtrueのときに背景色をGrayに、そうでなければWhiteに設定するという条件を付けたいと思います。

xamlでどうすればいいですか?

答えて

2

私はそのようなことについて聞いたことがありませんが、あなたが代わりにコンバータを使用することができます。あなたの最良の選択です。それはきれいで、再利用可能で、容易にプログラム可能です。

ここでは、このようなニーズに対する洗練された解決策があります(もちろん、これは単なる例です)。

ソリューションは、完全に再利用可能にするために構造体を作成します。

public struct NullableBoolColorScheme 
{ 
    public Color TrueColor { get; set; } 
    public Color FalseColor { get; set; } 
    public Color NullColor { get; set; } 

    public NullableBoolColorScheme(Color trueColor, Color falseColor, Color nullColor) 
    { 
     TrueColor = trueColor; 
     FalseColor = falseColor; 
     NullColor = nullColor; 
    } 

    public Color GetColor(bool? value) 
    { 
     if (!value.HasValue) 
      return NullColor; 
     else 
      return value.Value ? TrueColor : FalseColor; 
    } 
} 

は、あなたのコンバータを作成します。

public class NullableBoolToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is bool?)) return null; 

     Color returningColor = Color.Default; 

     if (parameter != null && parameter is NullableBoolColorScheme) 
      returningColor = ((NullableBoolColorScheme)parameter).GetColor((value as bool?)); 

     return returningColor; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new Exception("Conversion not allowed"); 
    } 
} 

はあなたのViewModelでそれをハンドル:

public class MyViewModel // Remember to implement INotifyPropertyChanged and raise property changes 
{ 
    public bool? MyNullableBoolProperty 
    { 
     get; 
     set; 
    } 

    public NullableBoolColorScheme AppColorScheme { get; } 

    public MyViewModel() 
    { 
     AppColorScheme = new NullableBoolColorScheme(Color.Gray, Color.White, Color.Transparent /* Some possibilities are open here =) */); 
    } 
} 
を10

はXAMLでそれを使用してください:

<!-- Declare your namespace --> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:converter="clr-namespace:Namespace.Converters" 
     ... 
     > 
<!-- Create your resources dictionary and add a converter instance --> 
    <ContentPage.Resources> 
     <ResourceDictionary> 
      <converter:NullableBoolToColorConverter x:Key="NullableBoolToColorConverter" /> 
     </ResourceDictionary> 
    </ContentPage.Resources> 
    <!-- Have fun --> 
    <Grid Margin="5,0,5,5" 
      Padding="10" 
      BackgroundColor="{Binding MyNullableBoolProperty, Mode=OneWay, Converter={StaticResource NullableBoolToColorConverter}, ConverteParameter={Binding AppColorScheme}}"> 
     ... 
    </Grid> 
    ... 
</ContentPage> 

私はそれはあなたを助ける(とでも英語の間違いを気の毒に)願っています。

1

XAMLではTernaryは使用できません。 (コンバーターを使用)

解決方法1:

おそらくValueConverterを使用して行くことができます。 IValueConverterを実装するコンバータを作成します。

このクラスを静的リソースとして追加すると、このコンバータを使用して値をバインドし、これに基づいて変換できます。

<Grid Margin="5,0,5,5" Padding="10" BackgroundColor="{Binding IsRead, Converter={StaticResource ReadUnReadToColorConverter}}"> 

ソリューション2(結合性を使用してのみ(一方向の溶液))::

あなたは単にColorを持つことができますが、次のように今

<ContentPage.Resources>  
    <local:ReadUnReadToColorConverter x:Key="ReadUnReadToColorConverter" /> 
</ContentPage.Resources> 

は、あなたのグリッドにこのコンバーターをバインドあなたの ViewModelのプロパティと getのプロパティの戻り値は、次のような条件に基づいています。

public Color ReadUnReadBackgroundColor 
{ 
    get 
    { 
     if(IsRead.HasValue && IsRead.Value == true) 
     { 
      return Color.Grey;      
     }  
     return Color.White;    
    } 
} 

は今すぐグリッドのBackgroundColorプロパティでこれをバインドします

<Grid Margin="5,0,5,5" Padding="10" BackgroundColor="{Binding ReadUnReadBackgroundColor}"> 
関連する問題