如何创建自定义 avalonia 控件

问题描述 投票:0回答:1

我正在学习 Avalonia,通过阅读文档我无法弄清楚这一点。

假设我想创建一个自定义用户控件,以便于在触摸屏上输入数字。 我只有屏幕,没有键盘,所以我希望我的控件由两个按钮和一个文本框或标签组成,如下所示:

|+|   Button for adding one
|5|   Actual value label
|-|   Button for substracting one

我希望该控件可以堆叠在像其本身一样的更高级别的控件数组上,每个控件代表最终数字的一位数字,或类似的东西。

我需要以下特征:

  • 能够绑定标签值以从外部读取和写入
  • 以某种方式意识到价值的变化
  • 能够设置初始值

感谢您提供任何线索或提示,我已经被这个问题困扰了至少一周,但似乎没有任何效果。我知道 Avalonia 有一个陡峭的学习曲线,但我不知道从哪里开始:)

-我尝试过的:

-使用模板化控件:

我无法弄清楚如何在触摸按钮时修改标签值,因为没有视图模型,而且我不知道如何使用后面的代码使按钮执行任何操作(有关此类控件的文档是没有多大帮助)

-使用用户控件:

A)与视图模型:

我创建一个样式属性来包含后面代码中标签的数值(因为我知道这是由更高级别的控件读取它的方式)并将按钮绑定到视图模型上的方法。问题是我无法从虚拟机修改样式属性,并且当我单击按钮时它不会更新。很多我不知道如何调用它,但从虚拟机访问背后的代码似乎出了问题。

B)仅隐藏代码:

这是最有希望的。

我创建了包含该值的样式化属性,并将按钮指向代码后面为该值加一或减一的方法,然后更新标签 (label.content=value)。它几乎可以工作,标签随按钮更新,我可以绑定样式属性以从外部读取。问题是我无法写入它。如果我希望控件起始值可由其父级分配。

我觉得答案是以某种方式将标签的文本绑定到样式属性,但背后的代码源自 UserControl,我不知道如何实现 ObservableObject (我正在使用社区工具包 mvvm),而且我不能创建任何要绑定的[可观察属性]。

c# xaml mvvm user-controls avaloniaui
1个回答
0
投票

我想通了。我遵循 UserControl 的方法,仅在后面添加代码。要在 styledProperty 更新时更新视图,我只需要重写 OnPropertyChanged() 方法:

protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
        {
            if(change.Property == MyOwnStyledProperty)
                MyOwnUpdateView();
            base.OnPropertyChanged(change);
        }

现在,当 StyledProperty 绑定到更高级别的控件时,我可以读取和写入,并确保前面始终显示该属性。

© www.soinside.com 2019 - 2024. All rights reserved.