gpt4 book ai didi

wpf - 将 ListBox 绑定(bind)到 ViewModel 的 ObservableCollection

转载 作者:行者123 更新时间:2023-12-03 10:48:54 25 4
gpt4 key购买 nike

使用 MVVM 将 ListBox 的项目绑定(bind)到 ViewModel 时是否有约定?

在下面的 XAML 中,我正在创建一个按钮列表框。 ListBox 绑定(bind)到我的 ViewModel 中的一个可观察集合。然后我想将按钮的 Command 属性绑定(bind)到 ICommand。问题是当我添加该绑定(bind)时,我绑定(bind)的是数据对象,而不是 ViewModel。

我只是将 MyListOfDataObjects 属性更改为 ViewModel 列表吗?如果是这样,我在哪里实例化这些新对象?我更喜欢使用依赖注入(inject),因为它们将有几个依赖项。我是否更改 GetData lambda?

一般来说:这里有什么好的做法?我找不到这种情况的任何例子,尽管我认为它很常见。

我正在使用 MVVMLight 框架,但我愿意查看任何其他框架。

<Window x:Class="KeyMaster.MainWindow"
DataContext="{Binding Main, Source={StaticResource Locator}}">

<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="MyDataTemplate">
<Button Command="{Binding ButtonPressedCommand}"
CommandParameter="{Binding .}"
Content="{Binding Name}" />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>

<Grid x:Name="LayoutRoot">
<ListBox ItemsSource="{Binding MyListOfDataObjects}"
ItemTemplate="{StaticResource MyDataTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"
IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ListBox>
</Grid>
</Window>

我正在使用标准的 MVVMLight ViewModel:
using GalaSoft.MvvmLight;
using KeyMaster.Model;
using System.Collections.ObjectModel;

namespace KeyMaster.ViewModel
{
public class MainViewModel : ViewModelBase
{
private readonly IDataService _dataService;
private ObservableCollection<MyData> _myListOfDataObjects;

public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item, error) =>
{
if (error != null)
{
return;
}

MyListOfDataObjects = new ObservableCollection<MyData>(item);
});
}

public ObservableCollection<MyData> MyListOfDataObjects
{
get { return _myListOfDataObjects; }
set
{
if (_myListOfDataObjects == value) return;

_myListOfDataObjects = value;
RaisePropertyChanged(() => MyListOfDataObjects);
}
}
}
}

谢谢。

最佳答案

在 MVVM 中,原始数据(也称为 Model)和 ViewModel 之间有明显的分离。 ViewModel 负责解析数据,甚至在将数据传递给 View 之前将其修改为所需的任何形式。

一个简单的例子是将模型作为 XML 并让 ViewModel 解析它,只从每个元素中获取特定属性(例如“Name”)并将它们添加到列表中。只有这个列表会显示在 View 中。

也就是说,我想你可以看到我要去哪里 - 命令应该在 ViewModel 中不是 在模型中。正如您自己所说,您应该将尽可能多的 UI 逻辑排除在 VM 和模型之外。

如果您有一个特定的命令对某种类型的数据执行特定操作,您可以希望它在更“通用”类型的 ViewModel 中,您可以使用 CanExectue仅在特定情况下允许此命令。但是,该命令仍应位于 ViewModel 中。

在您的特定情况下,我认为 ViewModel 中的命令没有问题,并且当它被提出时,它将对您的数据执行任何您需要的操作。您不需要 ViewModel 列表,您只需要一个。

关于wpf - 将 ListBox 绑定(bind)到 ViewModel 的 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115142/

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