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.您所做的事情不需要另一个窗口对象!您可以在主窗口中添加所有这些控件,并将其与视图模型一起分配。