gpt4 book ai didi

c# - 对于在 ViewModel 中放置逻辑代码的位置感到困惑

转载 作者:太空狗 更新时间:2023-10-30 00:51:37 27 4
gpt4 key购买 nike

我是 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 部分编写逻辑。假设我将有更多想要实现的文本框和列表。这是在属性中编写我的逻辑的正确方法还是我完全忽略了这一点?请帮助我理解这一点。提前致谢。

最佳答案

不,这不完全正确。

首先,逻辑通常进入模型,而不是 View 模型。也就是说,您有一个过滤器,它基本上是 UI 逻辑,所以它在这里可能没问题。

其次,过滤器只会在您设置搜索文本时发生变化,因此逻辑将进入 setter,而不是 getter。我也不会内联整个东西,将它放在自己的函数中,以便您以后可以重用它:

public String SearchText
{
...
set
{
serachText = value;
NotifyPropertyChanged();
UpdateResults();
}
}

public void UpdateResults()
{
...
}

要记住的一件事(并没有很好的解决方法)是,如果该功能需要很长时间才能运行,您的 UI 会真的变慢,同时用户正在打字。如果执行时间长,尝试缩短,然后考虑在单独的线程上执行。

关于c# - 对于在 ViewModel 中放置逻辑代码的位置感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25980742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com