我是WPF的新手,需要帮助在运行时设置数据网格中的特定行或样式,具体取决于存储数据的某些值。 我看到了这个thread但是无法解决我在运行时只存在的行问题 设计中存在的列。
任何一个例子都会很乐意接受。 谢谢!
编辑:我也找到了这个thread,但我需要一个C#代码......
答案 0 :(得分:19)
我无法从您的问题中判断您是否在运行时向网格添加列,但无论哪种方式,您都可以在设计时将CellStyle添加到网格中,以便使用DataTriggers处理您的特定样式需求。
例如,以下内容将使所有行变为红色,其中Name属性=“Billy Bob”:
<DataGrid AutoGenerateColumns="True" Name="dataGrid1">
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding Name}" Value="Billy Bob" >
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
如果要在运行时以编程方式添加列,并且想要对它们应用某种样式,则仍可以在设计时在xaml中定义这些样式。
<DataGrid AutoGenerateColumns="False" Name="dataGrid1">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}" x:Key="MyCellStyle">
<Setter Property="Foreground" Value="Green"/>
</Style>
</DataGrid.Resources>
...
然后,当您添加列时,可以将该样式应用于它们:
col.CellStyle = (Style)dataGrid1.Resources("MyCellStyle");
<强>更新强>
如果您有一个歌曲列表,并且想要更改每首歌曲的行颜色,而该歌曲的名称以“a”开头,那么您可以使用IValueConverter。
以下转换器可以解决这个问题:
public class ArtistNameConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
try
{
return value.ToString().StartsWith(parameter.ToString());
}
catch
{
return false;
}
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后你可以在你的xaml中使用转换器,如下所示:
<DataGrid AutoGenerateColumns="True" Name="dataGrid1">
<DataGrid.Resources>
<converters:ArtistNameConverter x:Key="ArtistNameConverter"></converters:ArtistNameConverter>
</DataGrid.Resources>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding ArtistName, Converter={StaticResource ArtistNameConverter}, ConverterParameter=a}" Value="True" >
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
注意我如何将“a”作为参数传递给转换器。您可以传入您想要的任何字母,并且具有以该字母开头的艺术家的行将其背景颜色设置为红色。
更新2
如果要将某种变量传递给转换器,可以使用MultiBinding。
转换器看起来像这样:
public class ArtistNameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
try
{
return values[0].ToString().StartsWith(values[1].ToString());
}
catch
{
return false;
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
传入的第一个参数是艺术家名称,第二个是字母。
你可以在你的网格中使用它:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Value="True" >
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ArtistNameConverter}">
<Binding Path="ArtistName" />
<Binding Mode="OneWay" ElementName="FirstLetter" Path="Text" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
在此示例中,第一个字母来自名为“FirstLetter”的控件的“Text”属性。您可以将绑定更改为您想要的任何内容。