簡體   English   中英

對於在ViewModel中放置邏輯代碼的位置感到困惑

[英]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應該負責將數據“轉換”為視圖可以處理的另一種形式(想想INotifyPropertyChangedObservableCollection等)

只有當邏輯被完全封裝在一個集合中時,你才能使用具有任何邏輯的ViewModel。 例如,如果您可以從List<T>獲得所需的一切,那么ViewModel將有效地擁有所有邏輯。 如果您需要超出該值的值,它應該在ViewModel之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM