在xaml.cs文件中(WPF应用程序)我创建了一个3列的DataTable 想要仅在xaml.cs中设置第二列的宽度。 另外,要将第二列的第一行背景色设置为蓝色(仅适用于第一行和第二列中的单元格)。
已创建3列为: DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn(“ ABC”); 同样,增加了2列。
要设置第二列的宽度
答案 0 :(得分:0)
我不是很确定,如果这是您想要的,但这是我会做的
首先:假设您已经创建了一个基本的DataTable,并用一些值填充了它,例如:
DataTable dt = new DataTable();
dt.Columns.Add("Key", typeof(int));
dt.Columns.Add("Material", typeof(string));
dt.Columns.Add("Price per Kilo", typeof(int));
dt.Rows.Add(1, "CobbleStone", 34);
dt.Rows.Add(2, "Wooden Planks", 12);
dt.Rows.Add(3, "Iron Ingots", 56);
在调试器中如下所示:
第二:获取一些VisualElement以显示您的数据。我建议使用DataGrid
。因此,转到您的MainWindows.xaml,并向DataGrid
添加一个Grid
,其中包含3个DataGridTextColumns
,如下所示:
<DataGrid>
</DataGrid>
由于我们要向列中添加自定义属性,因此我们必须向AutoGenerateColumns="False"
中添加 <DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Key" />
<DataGridTextColumn Header="Material" />
<DataGridTextColumn Header="Price per Kilo" />
</DataGrid.Columns>
</DataGrid>
,如果不这样做,则DataGrid将基于其ItemsSource自动生成其列。由于我们现在不会获得任何自动生成的列,因此我们还必须添加3个与DataTable中的3列类似的列:
ItemsSource
第三步:接下来,我们必须设置DataGrid
中的DataGrid
。不幸的是DataTable
无法处理DataTable
,因此我们首先必须将DataGrid
转换成using System.ComponentModel;
using System.Runtime.CompilerServices;
class Model : INotifyPropertyChanged
{
private int m_Key;
public int Key
{
get
{
return m_Key;
}
set
{
m_Key = value;
OnPropertyChanged("Key");
}
}
private string m_Name;
public string Name
{
get
{
return m_Name;
}
set
{
m_Name = value;
OnPropertyChanged("Name");
}
}
private int m_Price;
public int Price
{
get
{
return m_Price;
}
set
{
m_Price = value;
OnPropertyChanged("Price");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
可以读取的内容。让我们为此生成一个新的类,并将其命名为 MaterialModel ,如下所示:
DataGrid
它具有属性和PropertyChangedEventHandler,当属性更改时,它们将通知您的VisualElement。
第四: DataTables
不接受Lists
,但接受ObserableCollections
和List
。如果您不想在运行时添加/更改项目,请使用ObserableCollection
。我将使用using System.Collections.ObjectModel;
,它需要 public partial class MainWindow : Window
{
private ObservableCollection<MaterialModel> m_MaterialList;
public ObservableCollection<MaterialModel> MaterialList
{
get
{
return m_MaterialList;
}
set
{
m_MaterialList = value;
OnPropertyChanged("MaterialList");
}
}
public MainWindow()
{
// [...]
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
起作用。
创建列表的属性,并将PropertyChangedEventHandler添加到MainWindow。
ObservableCollection
下一步是将DataTable转换为 MaterialList = new ObservableCollection<MaterialModel>();
foreach(DataRow row in dt.Rows)
{
MaterialModel model = new MaterialModel
{
Key = int.Parse(row["Key"].ToString()),
Name = row["Material"].ToString(),
Price = int.Parse(row["Price per Kilo"].ToString()),
};
MaterialList.Add(model);
}
,因此遍历DataTable并将每一行转换为其中一个Model,如下所示:
DataGrid
第五:您的列表中充满了模型,下一步就是告诉您的ItemsSource
如何使用列表。首先,将您的列表绑定到DataGrid
之后的DataGridTextColumn
,然后将每个 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MaterialList}">
<DataGrid.Columns>
<DataGridTextColumn Header="Key" Binding="{Binding Key}" />
<DataGridTextColumn Header="Material" Binding="{Binding Name}" />
<DataGridTextColumn Header="Price per Kilo" Binding="{Binding Price}" />
</DataGrid.Columns>
</DataGrid>
绑定到MaterialModel中的一个属性,如下所示:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MaterialList}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Key" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Key}" Background="LightBlue"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Material" Binding="{Binding Name}" Width="300" />
<DataGridTextColumn Header="Price per Kilo" Binding="{Binding Price}" />
</DataGrid.Columns>
</DataGrid>
您将看到DataGrid起作用:
第六步:最后一步是实际设置列的属性,这很容易,您的“需求”将如下所示:
private double m_SecondColumnWidth;
public double SecondColumnWidth
{
get
{
return m_SecondColumnWidth;
}
set
{
m_SecondColumnWidth = value;
OnPropertyChanged("SecondColumnWidth");
}
}
public MainWindow()
{
SecondColumnWidth = 300;
}
我还没有找到一种可以在您想要的地方完全在Code中完全创建DataGrid的方法,但是无论如何,这将是一个坏习惯。 WPF旨在在xaml和c#之间使用此连接。
如果您仍然想在c#中管理列属性,这将是一种正确的方法:
在MainWindow.xaml.cs中:
<!-- right beneath your Grid -->
<Grid.Resources>
<local:ViewModel x:Key="viewModel" />
</Grid.Resources>
<DataGridTextColumn Header="Material" Binding="{Binding Name}" Width="{Binding Source={StaticResource viewModel}, Path=SecondColumnWidth}" />
XAML:
{{1}}
这并不是您想要的,但我希望它能以任何方式提供帮助。