【发布时间】:2017-03-01 09:44:37
【问题描述】:
所以,我有一个关于 MVVM+WPF 的问题:目前,我有一个 Sudoku 工作,并且我设法以我喜欢在 WPF 中使用 Sudoku 的方式生成了一个 Sudoku。
我的应用程序中的数独 WPF 图像
问题是网格是由我在 MainWindow.xaml.cs 文件中编写的一些代码创建的,我认为它应该在 ViewModel 中。 MainWindow.xaml.cs 中有问题的代码:
namespace SodukoWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private SudokoGameDesu sudokuAdapter;
public MainWindow()
{
InitializeComponent();
sudokuAdapter = new SudokoGameDesu();
CreateDynamicWPFGrid();
}
private void CreateDynamicWPFGrid()
{
// Create 9 rows & columns
for (int i = 0; i < 9; i++)
{
// Create column
sudokuGrid.ColumnDefinitions.Add(new ColumnDefinition());
... etc.
恕我直言,CreateDynamicWPFGrid() 应该移到我的 ViewModel 中。至少这是我认为这段代码最适合的地方。
namespace SodukoWPF.ViewModels
{
public class SudokoPresenter : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// TODO get .xaml.cs code in here
public SudokoPresenter()
{
//CreateDynamicWPFGrid();
}
在 CreateDynamicWPFGrid() 方法中,我使用 sudokuGrid,这是我的 .xaml 中的一个字段,因此我的代码也知道应该将我的 textBoxes/Blocks 添加到哪个网格中。
<Grid x:Name="contentGrid" HorizontalAlignment="Left" Height="570" Margin="0,0,0,0" VerticalAlignment="Top" Width="500">
<Grid x:Name="sudokuGrid" HorizontalAlignment="Left" Height="420" Margin="0,50,0,0" VerticalAlignment="Top" Width="488">
</Grid>
现在,无法从 .xaml.cs 代码外部访问此网格(当然)。所以在这一点上,我生成自己的 xaml 的方法(因为我认为这不能仅通过 xaml + 绑定来完成)给我一些问号,我是否正确应用了 MVVM。
理论上 ViewModel 不应该知道 View,但我仍然认为生成的 .xaml 应该在我的 SudokuPresenter - ViewModel 中,而不是在我认为最好应该为空的 .xaml.cs 中。
我还没有弄清楚如何将 SudokuGrid 导入到我的 ViewModel,但我的 MVVM 方法很可能一开始就有问题或被我误解了。
希望有人可以帮助我,这篇文章或多或少对我的困境有意义=)
(关于生成我自己的 .xaml 的 MVVM 方法 + 如果我做得或多或少正确,如何访问 sudokuGrid)
【问题讨论】:
-
我觉得你不了解 MVVM 模式。你绝对不应该在你的 ViewModel 中有任何 UI 问题。您的数独数据应该在您的 ViewModel 中,而网格本身应该在您的 xaml 中。你正确的一件事是关于你的 xaml.cs :它应该是空的,你应该使用模板或自定义控件来构建带有绑定的数独网格。
-
关于网格的事情是它是生成的,所以我不确定如何将数独绑定到网格。此外,网格使用 81 个矩形、9 个黑色矩形、81 个文本框/文本块,我不知道如何在不编写大量 .xaml 的情况下在网格中获得它。我认为生成将是最简单/最智能的方法,但这可能是我不正确地知道如何执行 WPF 和 xaml E:每次应用程序启动时都会生成网格/数独(+ 传递给视图),它当按下重置按钮时,也应该再次生成。
-
欢迎来到 StackOverflow!我很高兴看到仍有新用户花时间让他们的问题易于阅读并很好地解释!现在的问题是:为什么不构建一个名为 cell 的对象,该对象将保存所有单元格数据(值、位置等)并在您的 ViewModel 中创建一个单元格集合,您将使用绑定填充一个统一的网格?跨度>
-
这实际上听起来像是一个我没有想到的好主意,主要是因为我对 WPF 和 Xaml tbh 缺乏经验。让我朝着这个方向思考应该可以防止我现在遇到的整个问题,所以谢谢! =)。只需要谷歌并弄清楚如何让这些自定义单元格工作,但我想我可以完成它。
-
当您的网格并不总是相同时,通过代码生成网格的想法很有用,所以为什么不在 xaml 中编写您的网格。当数据发生变化时,开始新游戏时不需要生成网格,只需更改您的数据即可。如果您希望继续使用代码生成的网格,您也可以通过代码创建绑定:MSDN - How to: Create a Binding in Code