我正在学习 Avalonia,通过阅读文档我无法弄清楚这一点。
假设我想创建一个自定义用户控件,以便于在触摸屏上输入数字。 我只有屏幕,没有键盘,所以我希望我的控件由两个按钮和一个文本框或标签组成,如下所示:
|+| Button for adding one
|5| Actual value label
|-| Button for substracting one
我希望该控件可以堆叠在像其本身一样的更高级别的控件数组上,每个控件代表最终数字的一位数字,或类似的东西。
我需要以下特征:
感谢您提供任何线索或提示,我已经被这个问题困扰了至少一周,但似乎没有任何效果。我知道 Avalonia 有一个陡峭的学习曲线,但我不知道从哪里开始:)
-我尝试过的:
-使用模板化控件:
我无法弄清楚如何在触摸按钮时修改标签值,因为没有视图模型,而且我不知道如何使用后面的代码使按钮执行任何操作(有关此类控件的文档是没有多大帮助)
-使用用户控件:
A)与视图模型:
我创建一个样式属性来包含后面代码中标签的数值(因为我知道这是由更高级别的控件读取它的方式)并将按钮绑定到视图模型上的方法。问题是我无法从虚拟机修改样式属性,并且当我单击按钮时它不会更新。很多我不知道如何调用它,但从虚拟机访问背后的代码似乎出了问题。
B)仅隐藏代码:
这是最有希望的。
我创建了包含该值的样式化属性,并将按钮指向代码后面为该值加一或减一的方法,然后更新标签 (label.content=value)。它几乎可以工作,标签随按钮更新,我可以绑定样式属性以从外部读取。问题是我无法写入它。如果我希望控件起始值可由其父级分配。
我觉得答案是以某种方式将标签的文本绑定到样式属性,但背后的代码源自 UserControl,我不知道如何实现 ObservableObject (我正在使用社区工具包 mvvm),而且我不能创建任何要绑定的[可观察属性]。
我想通了。我遵循 UserControl 的方法,仅在后面添加代码。要在 styledProperty 更新时更新视图,我只需要重写 OnPropertyChanged() 方法:
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
if(change.Property == MyOwnStyledProperty)
MyOwnUpdateView();
base.OnPropertyChanged(change);
}
现在,当 StyledProperty 绑定到更高级别的控件时,我可以读取和写入,并确保前面始终显示该属性。