繁体   English   中英

WPF 方法绑定到 get() 和 set(value) 而不是属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM