gpt4 book ai didi

c# - MVVM 设置默认值

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:15 24 4
gpt4 key购买 nike

我敢肯定这是一个很常见的场景,我想知道 MVVM 开发人员如何解决这个问题。

我有一个按需实例化的 ViewModel,它会一直存在,直到它被用户明确删除。它对应的 View 按需加载到 UI 上。 View 能够卸载,它的 ViewModel 可能仍然存在于应用程序中。

在我的场景中,我在 View 中有一个预设颜色的列表框(通过将它的 ItemsSource 设置为 Xaml 定义的 SolidColorBrush 的 ObservableCollection)。

我将 ListBox 的 SelectedItem 属性绑定(bind)到 ViewModel 中的一个属性,这样当再次加载 View 时,SelectedItem 会正确显示 ListBox 中最后选择的项目,并且当用户选择不同的颜色时,VM 将处理变化。

我的问题是,当第一次加载 View 时,您将如何设置默认值,比如将 SolidColorBrush 的 ObservableCollection 中的第三项设置为 ViewModel?

最佳答案

通常我在构造函数中设置默认值,除非默认值可能需要一些时间才能加载,在这种情况下,我会调用一个方法在绑定(bind)属性的 getter 中设置它。

这样做的原因是为了简化维护。如果我正在寻找我设置默认值的位置以便我可以查看或更改它,我首先检查的是构造函数。它比滚动浏览属性更容易找到,并且已知包含初始化逻辑。

MyViewModel()
{
// Set defaults
SelectedColor = Brushes.Red;
}

对于加载时间可能较长的属性,出于同样的原因,我使用了在 getter 中调用的方法。通常我所有的属性和它们的 getter/setter 都隐藏在一个区域中,我发现在我的类中找到一个名为 LoadColors() 的方法比找到 Colors 更容易我拥有的大量属性列表中的属性。此外,它是可重用的,因此如果我需要执行某些操作(如重置值),无需重复我的代码即可轻松完成。

ObservableCollection<SolidColorBrush> Colors
{
get
{
if (_colors == null)
LoadColors();

return _colors;
}
set { ... }
}

void LoadColors()
{
// Initialization logic here
}

您还可以使用 FallbackValue 在 XAML 中设置默认值绑定(bind),但是这通常只有在评估绑定(bind)时绑定(bind)的 DataContext 可能不存在时才有意义。

<!-- You may have to look up the exact syntax for Brushes.Red -->
<ListBox SelectedItem="{Binding SelectedColor, FallbackValue=Red}" />

最后但并非最不重要的一点是,您始终可以借助 View 的代码隐藏来执行特定于 View 的逻辑,就像您的示例一样。例如,

void ComboBox_Loaded(object obj, EventArgs e)
{
if (MyComboBox.SelectedIndex == -1)
MyComboBox.SelectedIndex = 2;
}

关于c# - MVVM 设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3394380/

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