簡體   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