2016-05-05 106 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?