[英]Confused as to where to place logic code in ViewModel
我是C#/ WPF的新手,我想澄清一下我是否正確實現了我的ViewModel。
我創建了一個簡單的窗口,其中包含搜索文本框和結果列表框。
<TextBox Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ListBox ItemsSource="{Binding Results}" />
然后我有一個帶有以下代碼的ViewModel。
private List<string> lstStr;
public ViewModel()
{
lstStr = new List<string>();
lstStr.Add("Mike");
lstStr.Add("Jerry");
lstStr.Add("James");
lstStr.Add("Mikaela");
}
public List<string> LstStr
{
get
{
return lstStr;
}
set
{
if (lstStr != value)
{
lstStr = value;
OnPropertyChanged("LstStr");
}
}
}
private string searchText;
public string SearchText
{
get
{
return searchText;
}
set
{
if (searchText != value)
{
searchText = value;
OnPropertyChanged("SearchText");
UpdateResults();
}
}
}
private ObservableCollection<string> results = new ObservableCollection<string>();
public ObservableCollection<string> Results
{
get
{
return results;
}
set
{
if (results != value)
{
results = value;
OnPropertyChanged("Results");
}
}
}
public void UpdateResults()
{
int i = 0;
results.Clear();
while (i < LstStr.Count)
{
if (LstStr.ElementAt(i).ToString() != null)
{
if (searchText != null && searchText != "")
{
if (LstStr.ElementAt(i).Trim().Contains(searchText))
{
results.Add(LstStr.ElementAt(i));
Console.WriteLine(LstStr.ElementAt(i));
}
}
else
results.Clear();
}
else
Console.WriteLine("NULL");
i++;
}
}
我發現自己在ViewModel的代碼的Get或Set部分編寫邏輯。 假設我將有更多要實現的文本框和列表。 這是在屬性中編碼邏輯的正確方法還是我完全忽略了這一點? 請幫我理解這個。 提前致謝。
不,這不完全正確。
首先,邏輯通常在模型中,而不是視圖模型。 也就是說,你有一個過濾器,基本上是UI邏輯,所以它可能在這里。
其次,過濾器只會在您設置搜索文本時更改,因此邏輯將放入setter,而不是getter。 我也不會內聯整個事情,把它放在自己的函數中,以便以后可以重用它:
public String SearchText
{
...
set
{
serachText = value;
NotifyPropertyChanged();
UpdateResults();
}
}
public void UpdateResults()
{
...
}
要記住的一件事(並沒有真正的好方法)是,如果該功能需要很長時間才能運行, 那么在用戶輸入時,您的UI 確實會變慢。 如果執行時間很長,請嘗試縮短它,然后考慮在單獨的線程上執行。
ViewModels應該只負責將數據“轉換”為視圖可以處理的另一種形式(想想INotifyPropertyChanged
, ObservableCollection
等)
只有當邏輯被完全封裝在一個集合中時,你才能使用具有任何邏輯的ViewModel。 例如,如果您可以從List<T>
獲得所需的一切,那么ViewModel將有效地擁有所有邏輯。 如果您需要超出該值的值,它應該在ViewModel之外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.