[英]WPF Method binding to get() and set(value) instead of properties
有没有办法使用直接与方法交互的绑定来获取值并设置其值?
我有一个 class,它有方法而不是属性
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
}
}
为了实现数据绑定,我为每个 function 声明属性并调用模型的方法
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 绑定?
像这样:文本框将设置它的值并显示 Label
<TextBox Text="{MethodBinding MethodName=foo.SetProp1}"/>
<Label Content="{MethodBinding MethodName=foo.GetProp1}"/>
如果您真的下定决心,您可以在技术上设法绑定到方法,但我认为这不是一个很有帮助的答案。
在我工作过的任何商业团队中,这样做都会导致您的 MR/PR 被拒绝。 它被广泛认为是不好的做法。
我建议的是让这些属性改变常规属性。 在异步任务中为他们获取数据。
如果您定义了一个接口,那么您可以为所有的获取数据任务赋予相同的名称,并在您实例化的任何视图模型上通用地调用它们。
在我拥有的一些真实代码中,我称此为任务启动。
interface IInitiatedViewModel
{
Task Initiate();
}
这是我的一个视图模型中的一项这样的任务(稍微简化):
public async Task Initiate()
{
DateFrom = LastApril();
Transactions = await repository.GetFlattenedTransactionsAsync(DateFrom, DateTo);
}
Transactions 是 Datagrid 绑定到的公共属性。
因此,过程是实例化我的 ViewTransactionsViewModel。 它是一个 DI 容器,但我们不要离题太远。
我可以将该视图模型呈现给 UI,并将其模板化为视图。
它最初没有数据。
然后等待启动。
用数据设置我的属性。
在更复杂的场景中,Initiate 可以用 Tasks 启动多个线程。 安排数据可能非常昂贵,因此可以在另一个线程上启动一个(或多个)任务。
一个常见的变体是有一个基础视图模型,它公开一个 IsBusy 布尔值。 它用于标记命令并驱动繁忙的微调器。 这最初是正确的。 您的视图将使用微调器呈现。 Initiate 的最后一行是将 IsBusy 设置为 false。 微调器将消失,日期将被呈现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.