2016-05-05 81 views
0

所以我有这样的想法:将几个按钮添加到网格中,然后排列它们,添加的按钮数与我输入的数字有关。所有的工作都很好,直到我试图使它在MVVM下工作。在MVVM中访问Grid.Children.Add(WPF)

,在MainWindow.xaml.cs工作

代码:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     int i = 0, j = 0; 
     Brush[] bs = { Brushes.BurlyWood, Brushes.Honeydew }; 

     for (i = 0; i < 3; i++) 
     { 
      for (j = 0; j < 3; j++) 
      { 
       Button btn = new Button(); 
       btn.Height = 50; 
       btn.Width=50; 
       btn.SetValue(Grid.RowProperty, i); 
       btn.SetValue(Grid.ColumnProperty, j); 
       if ((i + j) % 2 == 0) 
       { 
        btn.Background=bs[0]; 
       } 
       else btn.Background = bs[1]; 

       GameGrid.Children.Add(btn); 
      } 
     } 
    } 

所以基本上,我按下一个按钮,并将其添加3x3的按键,漂亮的彩色和传播适当。但后来我到MVVM:

private void ButtonClickCommand() 
    { 
     RowCount = GridNumber; 
     ColumnCount=GridNumber; 
     int i = 0, j = 0; 

     Brush[] bs = { Brushes.BurlyWood, Brushes.Honeydew }; 

     for (i = 0; i < GridNumber; i++) 
     { 
      for (j = 0; j < GridNumber; j++) 
      { 
       Button btn = new Button(); 
       btn.Height = 50; 
       btn.Width = 50; 
       // btn.Command = StartCommand; Ill add that later 
       btn.SetValue(Grid.RowProperty, i); 
       btn.SetValue(Grid.ColumnProperty, j); 
       if ((i + j) % 2 == 0) 
       { 
        btn.Background = bs[0]; 
       } 
       else btn.Background = bs[1]; 

       somebuttonlist.Add(btn); 
      } 
     } 

    } 

这里我有按钮的列表,这应该接受新创建的按钮,然后将其传输到电网。按钮列表的代码:

private List<Button> _bslist = new List<Button>(); 
    public List<Button> somebuttonlist 
    { 
     get 
     { 
      return _bslist; 
     } 
     set 
     { 
      _bslist = value; 
      NotifyPropertyChanged(); 

     } 
    } 

和XAML代码:

<ItemsControl ItemsSource="{Binding somebuttonlist}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Grid Name="GameGrid" Visibility="{Binding GameVis}" 
       vm:GridHelpers.RowCount="{Binding RowCount}" 
       vm:GridHelpers.ColumnCount="{Binding ColumnCount}"> 
       </Grid> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

不介意所有绑定,它们工作正常,当我使用非MVVM格式。 那么,如何正确地将工作代码转移到视图模型?有没有办法相应地访问孩子?

回答

0

看起来您正在绑定到List,它不会在插入新记录或删除任何记录时进行通知。 NotifyPropertyChanged()只有在对该列表的引用被修改时才会启动,因此,例如,将其设置为new List()或其他List。尝试改为将其更改为ObservableCollection,该集合在集合中的记录数得到修改时发送event

+0

那么工作:D谢谢,我还有很多东西要学习 – NamelessCoder

0

这不是用MVVM做事情的正确方法。你现在要做的是将可视代码拖入你的ViewModel。理想情况下,ViewModels应该保留在一个单独的项目中,而不涉及任何可视化的东西。这样,引用Button将导致代码损坏,除非您为System.Windows.Controls添加引用,这会提醒您,您以错误的方式执行操作。

你想要做的是以纯MVVM方式实现,但是会产生更多的代码,如果你还没有掌握MVVM,那么代码也会变得复杂。另请注意,在现实生活中,为复杂场景设置一些代码是可以接受的。为此,您只需创建一个自定义控件来封装逻辑后面的所有代码。

在你的情况下,很好的解决方案可以是一个自定义控件,封装Grid和逻辑来填充按钮。您还可以为行和列添加依赖项属性,以便您可以在XAML中将它们绑定到它们,并定义在单击按钮时调用的命令。这可能是一个很好的例子:How to create bindable commands in Custom control?