[英]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.