如何在特定数据行的代码隐藏中设置样式 属性
How to set Style property in Code Behind for Specific DataRow
我在 Xaml.
中定义的 DataGrid 后面的代码中添加行
DataTable dt = new DataTable();
DataRow dr1 = dt.NewRow();
DataRow dr2 = dt.NewRow();
DataRow dr3 = dt.NewRow();
dr1.Style = (Style)Resources.FindName("CustomStyle");
dataGrid.ItemSource = dt;
嗯,dr1 没有 属性 称为 Style,我该怎么做?
这应该很简单,但我很难。
我知道这在 XAML 中非常简单,但需要在代码后面完成,因为我无法在 XAML 中定义行数,因为它们将被动态添加.
您可以使用 DataTrigger
来执行此操作。在下面的示例中,如果 State
的值为 State1
,它将显示为红色,如果为 State2
,则为 Green
。您可以将它绑定到数据表的另一个 属性、另一个值以及您喜欢的任何颜色。
<DataGrid ItemsSource="{Binding YourItemsSource}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="State1">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="State2">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
正如 CodingYoshi 所回答的那样,可以在 Xaml 中完成。
如果您需要完整的代码隐藏解决方案,那么您可以参考这个。
public MainWindow()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Col", typeof(string));
DataRow dr1 = dt.NewRow();
dr1[0] = "row1" ;
DataRow dr2 = dt.NewRow();
dr2[0] = "row2";
DataRow dr3 = dt.NewRow();
dr3[0] = "row3";
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
dt.Rows.Add(dr3);
dataGrid.ItemsSource = dt.AsDataView();
dataGrid.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
// This will ensure, items are generated over UI.
if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
int index = 1; // add logic to get index of row to be styled.
var row = (DataGridRow)dataGrid.ItemContainerGenerator
.ContainerFromIndex(index);
// creating style, can be picked from resources aswell.
Style style = new Style
{
TargetType = typeof(Control)
};
style.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Green));
// Applied logic
row.Style = style;
}
}
我在 Xaml.
中定义的 DataGrid 后面的代码中添加行DataTable dt = new DataTable();
DataRow dr1 = dt.NewRow();
DataRow dr2 = dt.NewRow();
DataRow dr3 = dt.NewRow();
dr1.Style = (Style)Resources.FindName("CustomStyle");
dataGrid.ItemSource = dt;
嗯,dr1 没有 属性 称为 Style,我该怎么做?
这应该很简单,但我很难。
我知道这在 XAML 中非常简单,但需要在代码后面完成,因为我无法在 XAML 中定义行数,因为它们将被动态添加.
您可以使用 DataTrigger
来执行此操作。在下面的示例中,如果 State
的值为 State1
,它将显示为红色,如果为 State2
,则为 Green
。您可以将它绑定到数据表的另一个 属性、另一个值以及您喜欢的任何颜色。
<DataGrid ItemsSource="{Binding YourItemsSource}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="State1">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="State2">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
正如 CodingYoshi 所回答的那样,可以在 Xaml 中完成。
如果您需要完整的代码隐藏解决方案,那么您可以参考这个。
public MainWindow()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Col", typeof(string));
DataRow dr1 = dt.NewRow();
dr1[0] = "row1" ;
DataRow dr2 = dt.NewRow();
dr2[0] = "row2";
DataRow dr3 = dt.NewRow();
dr3[0] = "row3";
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
dt.Rows.Add(dr3);
dataGrid.ItemsSource = dt.AsDataView();
dataGrid.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
// This will ensure, items are generated over UI.
if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
int index = 1; // add logic to get index of row to be styled.
var row = (DataGridRow)dataGrid.ItemContainerGenerator
.ContainerFromIndex(index);
// creating style, can be picked from resources aswell.
Style style = new Style
{
TargetType = typeof(Control)
};
style.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Green));
// Applied logic
row.Style = style;
}
}