簡體   English   中英

如何將另一個類的屬性值設置為XAML屬性

[英]How to set to XAML property a property value from another class

我正在嘗試將另一個類的屬性值設置為XAML UI元素property。 我有XAML和稱為“ Config”的靜態類。 在Config類中,我有公共靜態類Theme。 在主題類中,我具有屬性primaryColor。 所以我需要在XAML中將primaryColor設置為UI元素。

我嘗試了x:Static,但是它對我不起作用,因為Theme類中的字段不是靜態的。

XAML:

<StackLayout BackgroundColor={x:Static config:Config.CurrentTheme.primaryColor}></StackLayout>

Config.cs:

public static class Config
{
    public static Theme CurrentTheme { get; set; }
}

Theme.cs:

public class Theme
{
    public Color primaryColor { get; set; } = Color.FromHex("#1D1E1F");
    public Color secondaryColor { get; set; } = Color.FromHex("#252625");
    public Color grayColor { get; set; } = Color.FromHex("#2F2F2F");
    public Color lightGrayColor { get; set; } = Color.FromHex("#626261");
    public Color goldColor { get; set; } = Color.FromHex("#CAA440");
    public Color lightGreenColor { get; set; } = Color.FromHex("#28A745");
    public Color darkRedColor { get; set; } = Color.FromHex("#F0373A");
}

當您了解x:Static它會直接說:

x:Static訪問以下之一:

  • 公共靜態場
  • 公共靜態財產
  • 公共常量字段
  • 枚舉成員。

由於您的媒體資源不符合上述條件,因此無效!

靜態添加到Theme.cs ,然后可以在Xaml中使用:

public static class Theme
{
    public static Color primaryColor { get; set; } = Color.FromHex("#1D1E1F");
    public static Color secondaryColor { get; set; } = Color.FromHex("#252625");
    public static Color grayColor { get; set; } = Color.FromHex("#2F2F2F");
    public static Color lightGrayColor { get; set; } = Color.FromHex("#626261");
    public static Color goldColor { get; set; } = Color.FromHex("#CAA440");
    public static Color lightGreenColor { get; set; } = Color.FromHex("#28A745");
    public static Color darkRedColor { get; set; } = Color.FromHex("#F0373A");
}

Xaml

<StackLayout BackgroundColor="{x:Static local:Theme.grayColor}"></StackLayout>

不要忘記在xaml中添加本地引用:

xmlns:local="clr-namespace:YourprojectNameSpace"

==================================更新============== ======================

如果要通過viewmodel更改具有綁定屬性的顏色,請嘗試使用IValueConverter

public class StringToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string valueAsString = value.ToString();
        switch (valueAsString)
        {
            case (""):
                {
                    return Color.Default;
                }
            case ("Accent"):
                {
                    return Color.Accent;
                }
            default:
                {
                    return Color.FromHex(value.ToString());
                }
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

Config.cs應該修改如下:

public class Config : INotifyPropertyChanged
{
    private string mycolor;

    public string MyColor
    {
        get { return mycolor; }
        set
        {
            mycolor = value;
            OnPropertyChanged("MyColor");
        }
    }

    public Config (){
        mycolor = "#00FF00"; // can set a defalut color here
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

在Xaml中:

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

<StackLayout BackgroundColor="{Binding MyColor, Converter={StaticResource StringToColorConverter}}"></StackLayout>

最后, ContentPage需要綁定Model Config.cs

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        Config config = new Config();
        this.BindingContext = config;

        //MyColor can be modified runtime
          config.MyColor = "#00FF00";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM