从视图模型属性获取背景颜色

Sam*_*Sam 1 maui

是否可以从 ViewModel 中的属性获取 control\xe2\x80\x99s 背景颜色?

\n

目的是能够改变用户操作的颜色BorderButton基于用户操作的颜色。因为我\xe2\x80\x99m 使用 MVVM 方法,所以理想情况下,我只需通过视图模型中的属性设置控件的背景颜色。

\n

我尝试了以下方法,但它没有 \xe2\x80\x99 工作:

\n
<Border\n   BackgroundColor="{Binding MyBorderBackgroundColor}">\n    <Label Text=\xe2\x80\x9cHello World\xe2\x80\x9d />\n</Border>\n
Run Code Online (Sandbox Code Playgroud)\n

在我的视图模型中,我使用一个string属性并将其设置为颜色名称(例如)Red或十六进制值(例如)#FF0000。我有一个Init()调用的方法OnAppearing()并设置值的方法 - 见下文:

\n
[ObservableProperty]\nstring myBorderBackgroundColor;\n    \n...\n    \npublic void Init()\n{\n   MyBorderBackgroundColor = "Red"; // Or Hex value => MyBorderBackgroundColor = "#FF0000";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

该应用程序只是忽略颜色设置并默认为页面背景。没有错误,但只是不使用通过视图模型属性设置的值。

\n

有什么建议么?

\n

Ger*_*uis 5

你的支持属性是 a string,而它应该是 a Color。不过,我确实理解您会认为这可行,因为在 XAML 中您可以简单地向其中添加一个字符串。

背景

要理解为什么它在 XAML 中有效但在代码中无效,我们必须了解TypeConverter. 由于 XAML 只能包含字符串,因此我们必须找到一种方法将该字符串转换为实际可用的类型。我们就是TypeConverter这么做的。

在我们希望人们在 XAML 中使用字符串但仍期望获得所需结果的对象上,我们添加此属性,这里它用于Color

[TypeConverter(typeof(Converters.ColorTypeConverter))]
public class Color
{
   /// The class
}
Run Code Online (Sandbox Code Playgroud)

如果您好奇的话,这里是完整的实现ColorTypeConverter

这意味着,当 XAML 解析器找到此属性和相应的(字符串)值时,它将首先调用该属性,并生成要使用的TypeConverter具体类型(在我们的示例中)。Color

当您像现在这样进行绑定时,TypeConverter不会调用 ,因此我们现在将字符串值绑定到需要对象的属性Color,因此:不起作用。

修复方法

要解决此问题,请将支持属性更改为 aColor并按原样初始化它。

[ObservableProperty]
Color myBorderBackgroundColor;

// ...
    
public void Init()
{
   MyBorderBackgroundColor = Colors.Red; // Or Hex value => MyBorderBackgroundColor = Color.FromArgb("#FF0000");
}
Run Code Online (Sandbox Code Playgroud)

您的 XAML 包含一个小错误,绑定周围没有引号。不确定这是否在您的实际代码中,但只是为了确定一下。确保值周围有引号,BackgroundColor如下所示:

<Border
   BackgroundColor="{Binding MyBorderBackgroundColor}">
    <Label Text="Hello World" />
</Border>
Run Code Online (Sandbox Code Playgroud)