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

uinbv5nw  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(284)

有没有什么方法可以使用绑定直接与方法交互来获取值和设置值?
我有一个类,它有方法而不是属性

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}"/>
tsm1rwdh

tsm1rwdh1#

从技术上讲,如果你真的下定决心,你可以设法绑定到方法,但我不认为这是一个很有帮助的答案。
在我工作过的任何一个商业团队中,这样做都会导致你的MR/PR被拒绝,这被广泛认为是不好的做法。
我的建议是让这些属性成为常规属性,引发属性变化。在异步任务中获取它们的数据。
如果你定义了一个接口,那么你可以给予所有的获取数据任务一个相同的名字,并且在你示例化的任何视图模型上调用它们。
在我的一些真实的代码中,我称之为任务启动。

interface IInitiatedViewModel
{
    Task Initiate();
}

下面是我的一个视图模型的一个这样的任务(稍微简化):

public async Task Initiate()
    {
        DateFrom = LastApril();
        Transactions = await repository.GetFlattenedTransactionsAsync(DateFrom, DateTo);
    }

Transactions是Datagrid绑定到的公共属性。
进程是示例化我的ViewTransactionsViewModel,它来自一个DI容器,但我们不要离题太远。
我可以将该视图模型呈现给UI,并将其模板化为视图。
它最初没有数据。
然后等待启动。
用数据设置我的属性。
在更复杂的情况下,Initiate可以启动带有任务的多个线程。为了在另一个线程上启动一个(或多个)任务,安排数据可能会非常昂贵。
一个常见的变化是有一个基础视图模型,它公开了一个IsBusy bool。它被用来标记命令和驱动一个繁忙的微调器。这最初是真的。你的视图将呈现一个微调器。初始化的最后一行将设置IsBusy为假。微调器将消失,日期将被呈现。

相关问题