(ViewModel)DataContext返回null

时间:2016-02-14 14:15:53

标签: c# wpf

我有以下事件:

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();
}

我期待ConnectFourViewModel行currentViewModel =(ConnectFourViewModel)DataContext;设置currentViewModel以反映我的UI正在运行的信息。不幸的是,它返回null并且我不确定原因。

这显然凸显了我对这个主题的理解上的差距,但不确定如何解决它我可以用手。 知道我哪里出错了?

1 个答案:

答案 0 :(得分:2)

您尚未在任何地方将DataContext分配给ViewModel。假设您希望ViewModel成为MainWindow的ViewModel,我建议您在Initialize Component之前分配它,如下所示。由于它从未被分配,因此您将获得null。

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