有没有什么方法可以使用绑定直接与方法交互来获取值和设置值?
我有一个类,它有方法而不是属性
public class Foo
{
public object GetProp1()
{
//some logic
return someObject;
}
public object GetProp2()
{
//some logic
return someObject;
}
public object SetProp1(object someObject)
{
//some logic
}
public object SetProp2(object someObject)
{
//some logic
}
}
为了实现数据绑定,我为每个函数声明属性并调用模型的方法
public class FooViewModel
{
Foo foo = new Foo();
public object Prop1
{
get => foo.GetProp1();
set => foo.SetProp1(value);
}
public object Prop2
{
get => foo.GetProp2();
set => foo.SetProp2(value);
}
}
问题是如果我有50个方法,在Foo中,我需要在ViewModel中创建大约50个属性。有没有其他方法可以消除ViewModel中的属性,只是为了与View绑定?
大概是这样的文本框将设置其值并显示标签
<TextBox Text="{MethodBinding MethodName=foo.SetProp1}"/>
<Label Content="{MethodBinding MethodName=foo.GetProp1}"/>
1条答案
按热度按时间tsm1rwdh1#
从技术上讲,如果你真的下定决心,你可以设法绑定到方法,但我不认为这是一个很有帮助的答案。
在我工作过的任何一个商业团队中,这样做都会导致你的MR/PR被拒绝,这被广泛认为是不好的做法。
我的建议是让这些属性成为常规属性,引发属性变化。在异步任务中获取它们的数据。
如果你定义了一个接口,那么你可以给予所有的获取数据任务一个相同的名字,并且在你示例化的任何视图模型上调用它们。
在我的一些真实的代码中,我称之为任务启动。
下面是我的一个视图模型的一个这样的任务(稍微简化):
Transactions是Datagrid绑定到的公共属性。
进程是示例化我的ViewTransactionsViewModel,它来自一个DI容器,但我们不要离题太远。
我可以将该视图模型呈现给UI,并将其模板化为视图。
它最初没有数据。
然后等待启动。
用数据设置我的属性。
在更复杂的情况下,Initiate可以启动带有任务的多个线程。为了在另一个线程上启动一个(或多个)任务,安排数据可能会非常昂贵。
一个常见的变化是有一个基础视图模型,它公开了一个IsBusy bool。它被用来标记命令和驱动一个繁忙的微调器。这最初是真的。你的视图将呈现一个微调器。初始化的最后一行将设置IsBusy为假。微调器将消失,日期将被呈现。