C# (ViewModel)返回null的DataContext

C# (ViewModel)返回null的DataContext,c#,wpf,C#,Wpf,我有以下事件: private void PlaceToken(object sender, RoutedEventArgs e) { ConnectFourViewModel currentViewModel = (ConnectFourViewModel)DataContext; Button button = (Button)sender; int currentColumn = Convert.ToInt32(button.Content); int

我有以下事件:

private void PlaceToken(object sender, RoutedEventArgs e)
{
    ConnectFourViewModel currentViewModel = (ConnectFourViewModel)DataContext;

    Button button = (Button)sender;

    int currentColumn = Convert.ToInt32(button.Content);

    int currentPlayer = currentViewModel.Board.CurrentPlayer;
    currentViewModel.Board.PlaceToken(currentColumn, currentPlayer);
}
在以下设置之后:

public MainWindow()
{
    var window = new Window();
    var grid = new Grid {};
    ConnectFourViewModel ViewModel = new ConnectFourViewModel();

    //Set up rows and cols
    for(int i = 1; i<=7; i++)
    {
        var col = new ColumnDefinition();
        grid.ColumnDefinitions.Add(col);
    }
    for (int i = 1; i <= 7; i++)
    {
        var row = new RowDefinition();
        grid.RowDefinitions.Add(row);
    }

    //Set up tiles
    foreach (var item in ViewModel.Board.AllTiles)
    {
        int index = ViewModel.Board.AllTiles.IndexOf(item);

        string name =
              "Col" +
              Convert.ToString(item.Column) +
              "_Row" +
              Convert.ToString(item.Row);

        Label currentTile = new Label{ Name = name};
        Grid.SetRow(currentTile, item.Row - 1);
        Grid.SetColumn(currentTile, item.Column -1);

        //Bind
        var binding = new Binding();
        binding.Source = ViewModel.Board.AllTiles[index];
        binding.Path = new PropertyPath("Contents");

        currentTile.SetBinding(ContentProperty, binding);

        //Add
        grid.Children.Add(currentTile);
    }

    //Set up Buttons
    for (int i = 1; i <= 7; i++)
    {
        Button currentButton = new Button { };

        //binding
        var binding = new Binding();
        binding.Source = ViewModel.CurrentColumn;

        currentButton.SetBinding(ContentProperty, binding);

        //Set Column names, this has to be after the binding has been set.
        currentButton.Content = i;
        //events
        currentButton.Click += new RoutedEventHandler(PlaceToken);

        //add
        Grid.SetColumn(currentButton, i - 1);
        Grid.SetRow(currentButton, 7);
        grid.Children.Add(currentButton);
    }

    window.Content = grid;
    window.DataContext = ViewModel;
    window.Show();
    InitializeComponent();
}
public主窗口()
{
var窗口=新窗口();
var grid=新网格{};
ConnectFourViewModel ViewModel=新的ConnectFourViewModel();
//设置行和列

对于(int i=1;i您尚未将
DataContext
分配给
ViewModel
任何位置。假设您希望
ViewModel
成为主窗口的ViewModel,我建议您在
初始化组件之前分配它,如下所示。因为从未分配过它,所以您将得到null

public MainWindow()
{
    ConnectFourViewModel ViewModel = new ConnectFourViewModel();
    . . .
    . . .
    DataContext = ViewModel ;
    InitializeComponent();
}

如果你在类中实例化了ViewModel,为什么要从DataContext中转换它呢?你可以只使用实例..还可以看看那段代码很糟糕,其中90%应该是XAML。谢谢,一个很好的简洁回答。作为后续问题:你可以看到我在哪里设置了window.DataContext,因为我的界面确实在window中DataContext应该在那个单独的窗口中工作。当窗口中的所有内容都表示在窗口中时,为什么我要为主窗口设置上下文?我无法理解您的问题。我想您是在询问质量反馈?!您所采取的方法有很多错误。您在编写类似Winform的代码时没有使用XAML.2.您所做的事情不需要另一个窗口对象!您可以在主窗口中添加所有这些控件,并将其与视图模型一起分配。