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