我有
if (e.PropertyType == typeof(bool))
{
e.Column.Header = "Status";
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Status";
DataTemplate imageTemplate = new DataTemplate();
DataTrigger imageBoolTrigger = new DataTrigger();
Converter.BoolToImage boolToImage = new Converter.BoolToImage();
Uri trueImageURI = new Uri(@"pack://application:,,,/MonitorView_wpf;component/Images/Icons/check-mark-16.png", UriKind.RelativeOrAbsolute);
boolToImage.TrueImage.Source = new BitmapImage(trueImageURI);
imageBoolTrigger.Binding = new Binding { Converter = boolToImage, ConverterParameter = e.Column };
imageTemplate.Triggers.Add(imageBoolTrigger);
templateColumn.CellTemplate = imageTemplate;
e.Column = templateColumn;
}
但是,它不起作用。
如何使用图片而不是自动生成的复选框?
我的转换器看起来像这样:
public class BoolToImage : IValueConverter
{
public Image TrueImage { get; set; }
public Image FalseImage { get; set; }
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (!(value is bool))
{
return null;
}
bool b = (bool) value;
if (b)
{
return this.TrueImage;
}
else
{
return this.FalseImage;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我的形象确实存在于组合中,这是一种尝试各种各样的东西,但从不工作。
提前致谢
答案 0 :(得分:1)
我喜欢的代码背后太多了,我个人会在资源中为它创建一个模板:
<DataGridTemplateColumn x:Key="booleanImageTemplate">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="theImage" Width="64" Height="64" Source="true_image.png"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding theBooleanPropertyName}" Value="False">
<Setter TargetName="theImage" Property="Source" Value="false_image.png"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
然后在创建时覆盖它:
<Grid>
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding}" AutoGeneratingColumn="OnAutogeneratingColumn" />
</Grid>
private void OnAutogeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column.Header.ToString() == "theBooleanPropertyName")
e.Column = (DataGridTemplateColumn)Resources["booleanImageTemplate"];
}
我刚刚在这里使用了一个图像(有效地使列只读)但它对模板化的复选框同样有效。
答案 1 :(得分:1)
您是否尝试在转换器中放置断点并查看该代码是否实际运行? 也许,在代码中创建DataTemplate的更好方法是使用FrameworkElementFactory,因此下面的代码应该可以工作: -
if (e.PropertyType == typeof(bool))
{
DataTemplate imageTemplate= new DataTemplate();
//set up the stack panel
FrameworkElementFactory imageFactory = new FrameworkElementFactory(typeof(Image));
Converter.BoolToImage boolToImage = new Converter.BoolToImage();
Uri trueImageURI = new Uri (@"pack://application:,,,/MonitorView_wpf;component/Images/Icons/check-mark-16.png", UriKind.RelativeOrAbsolute);
boolToImage.TrueImage.Source = new BitmapImage(trueImageURI);
var binding= new Binding { Converter = boolToImage, ConverterParameter = e.Column };
imageFactory.SetBinding(Image.SOurceProperty,binding);
//set the visual tree of the data template
imageTemplate.VisualTree = imageFactory ;
var templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Status";
templateColumn.CellTemplate=imageTemplate;
e.Column=templateColumn;
}
您还可以使用'XamlReader'在代码中创建模板。
下面的代码使用XamlReader在代码中创建DataTemplate并将其分配给CellTemplate。
var templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Status";
templateColumn.CellTemplate = XamlReader.Parse(GetDataTemplate()) as DataTemplate;
e.Column = templateColumn;
public string GetDataTemplate()
{
var dt = @"<DataTemplate x:Key=""dt"" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<Canvas>
<Ellipse
Canvas.Top=""5""
Canvas.Left=""5""
Fill=""#FFFFFF00""
Height=""10""
Width=""10""
StrokeThickness=""5""
Stroke=""#FF0000FF""/>
</Canvas>
</DataTemplate>";
return dt;
}
请注意,这会使用带有椭圆的Canvas,但您可以轻松放置路径。
答案 2 :(得分:0)
如果我的理解是正确的,我建议你将AutoGenerateColumns设置为false。
使用转换器将布尔值转换为所需的图像。 这是我项目中的一个类似示例。 我没有使用图像,而是根据绑定的布尔值更改了背景颜色。
<DataGridTemplateColumn Header="5_5" MaxWidth="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Textblock Background="{Binding _booleanValue, Converter={StaticResource ResourceKey=hourSlotColorConverter},
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
这就是我的转换器的样子:
class HourSlotToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// if value isn't null, we can safely do the conversion.
if (value != null)
{
if ((bool)value)
return Brushes.LimeGreen;
}
return Brushes.White;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我希望这会有所帮助。