【发布时间】:2018-07-03 05:41:03
【问题描述】:
鉴于我的 MVVM 应用程序中的两个模型:
MyFolder 包含文件列表 (MyFiles):
public class MyFolder
{
public string Path { get; set; }
public int Id { get; set; }
public List<MyFile> FilesList { get; set; }
}
public class MyFile
{
public string Path { get; set; }
public int Size { get; set; }
}
在我的 Viewmodel 中,我有一个带有文件夹的 ObservableCollection:
public ObservableCollection<MyFolder> FoldersList { get; set; }
我正在查看一个 ListBox 中的文件夹,而在另一个 ListBox 中我显示了所选文件夹的文件列表(也在 ViewModel 中定义):
private MyFolder selectedFolder;
public MyFolder SelectedFolder
{
get { return selectedFolder; }
set
{
selectedFolder = value;
OnPropertyChanged(nameof(SelectedFolder));
}
}
我需要的是能够选择列表框中显示的一些文件来对它们执行一些操作(比如说更改它们的扩展名)
<ListBox ItemsSource="{Binding Path=FoldersList.FilesList}" SelectedItem="{Binding Path=SelectedFolder, Mode=OneWayToSource}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox IsChecked="{Binding ????}"/>
<Label VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Content="{Binding Path=Path}">
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我可以向 MyFiles 类添加一个属性,例如 bool Selected,然后将此属性绑定到 CheckBox。
但是,这是 MVVM 模式中的方法吗?
或者我应该怎么做?
非常感谢任何想法。 提前致谢
【问题讨论】:
-
差不多了。您的 ViewModel 类只是视图和模型之间的行为映射,您似乎没有这样的层。您在此处显示的类显然是模型类,但您应该在两者之间有一个 viewmodel 类。然后,该类将维护值,例如该项目是否在视图中被选中。
-
@LordWilmore 我很确定 OP 只发布了相关代码。他已经有一个视图模型来存储文件夹列表,所以我想我也有逻辑。
-
@DanieleSartori OP 询问正确的 MVVM 方法。 MyFile 和 MyFolder 类在我看来就像 Model 类。如果它们不是,它们实际上是 ViewModel 类,那么我们都是对的 ;)
-
@LordWilmore:谢谢您的回复,是的,我确实有一个具有 FolderList 的虚拟机...但是您的意思是我仍然需要一个 FolderViewModel(我的模型的包装器),如下面的答案?我的虚拟机只有我填写的文件夹列表。