First of all, you should consider using WPF with at least a bit of MVVM pattern.
It means you're gonna provide DataContext class for your View (V) called ViewModel(VM). We're gonna move all the data we will later on bind controls to there.
ViewModel:
public class ViewModel
{
public DataTable dt { get; set; }
public ViewModel()
{
dt = new DataTable();
dt.Columns.Add(new DataColumn("Col1", typeof(String)));
dt.Columns.Add(new DataColumn("Col2", typeof(String)));
dt.Columns.Add(new DataColumn("ButtonsList", typeof(ButtonsList)));
dt.Rows.Add("Test1", "Test1", new ButtonsList { Content = "ButtonTest1", ToolTip = "TooltipTest1" });
dt.Rows.Add("Test2", "Test2", new ButtonsList { Content = "ButtonTest2", ToolTip = "TooltipTest2" });
}
}
Our Window (View) will be now only responsible for what it's made for: presenting data. I've changed name to basic, generated one. Hope it doesn't confuse you.
View:
public partial class MainWindow : Window
{
ViewModel _viewModel;
public MainWindow()
{
_viewModel = new ViewModel();
this.DataContext = _viewModel;
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MainWindow MainWindow = new MainWindow();
MainWindow.Show();
}
}
I will now bind directly to the data that is exposed by property in ViewModel. In this example only property shown outside is DataTable dt.
View (XAML):
<Window x:Class="Course.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="dtGrid" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-17,-6.538" Height="299" Width="497" ItemsSource="{Binding dt}">
<DataGrid.Columns>
<DataGridTextColumn Header="Col1" Binding="{Binding Path=Col1}"></DataGridTextColumn>
<DataGridTextColumn Header="Col2" Binding="{Binding Path=Col2}"></DataGridTextColumn>
<DataGridTemplateColumn Header="Button">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding Path=ButtonsList.Content}" ToolTip="{Binding Path=ButtonsList.Tooltip}" Click="Button_Click"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Let's seperate our ButtonsList into different class for reusability and access purposes.
ButtonsList:
public class ButtonsList
{
public String Content { get; set; }
public string ToolTip { get; set; }
}
All should work nicely now and meet basic programming pattern requirements.