Wpf 使用IValueConverter在多个dataGrid单元中显示相同的xaml格式图像
我有一个有效的解决方案,通过使用Wpf 使用IValueConverter在多个dataGrid单元中显示相同的xaml格式图像,wpf,xaml,Wpf,Xaml,我有一个有效的解决方案,通过使用将布尔值转换为包装在中的xaml图像,如下所示: <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ContentControl Content="{Binding Recommended, Converter={StaticResource BoolImageConv
将布尔值转换为包装在
中的xaml图像,如下所示:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding Recommended, Converter={StaticResource BoolImageConverter}}" Height="20"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
转换器的想法来自:
您的ViewBox是一个带有键的控件。控件只能有一个可视父级。所以第一个单元格独占了ViewBox,其他单元格无法使用它 在您的情况下,最好使用属性。 首先,创建自定义DataTemplateSelector:
public class TrueFalseSelector : DataTemplateSelector
{
public DataTemplate TrueTemplate { get; set; }
public DataTemplate FalseTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == null) return null;
var isSomething = ((CustomObjectType) item).CustomBoolProperty;
return isSomething ? this.TrueTemplate
: FalseTemplate;
}
}
然后在XAML中使用它。在某个地方添加选择器资源:
<local:TrueFalseSelector x:Key="trueFalseSelector">
<local:TrueFalseSelector.TrueTemplate>
<DataTemplate>
<!-- your true template here -->
</DataTemplate>
</local:TrueFalseSelector.TrueTemplate>
<local:TrueFalseSelector.FalseTemplate>
<DataTemplate>
<!-- your false template here -->
</DataTemplate>
</local:TrueFalseSelector.FalseTemplate>
</local:TrueFalseSelector>
瞧
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplateSelector="{StaticResource trueFalseSelector}" />
</DataGrid.Columns>
编辑:您可以将DataTemplates放置在当前ViewBox所在的同一词典中。给他们一把钥匙,然后像这样使用:
<local:TrueFalseSelector x:Key="trueFalseSelector"
FalseTemplate="{StaticResource falseTemplate}"
TrueTemplate="{StaticResource trueTemplate">
您的ViewBox是一个带有键的控件。控件只能有一个可视父级。所以第一个单元格独占了ViewBox,其他单元格无法使用它 在您的情况下,最好使用属性。 首先,创建自定义DataTemplateSelector:
public class TrueFalseSelector : DataTemplateSelector
{
public DataTemplate TrueTemplate { get; set; }
public DataTemplate FalseTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == null) return null;
var isSomething = ((CustomObjectType) item).CustomBoolProperty;
return isSomething ? this.TrueTemplate
: FalseTemplate;
}
}
然后在XAML中使用它。在某个地方添加选择器资源:
<local:TrueFalseSelector x:Key="trueFalseSelector">
<local:TrueFalseSelector.TrueTemplate>
<DataTemplate>
<!-- your true template here -->
</DataTemplate>
</local:TrueFalseSelector.TrueTemplate>
<local:TrueFalseSelector.FalseTemplate>
<DataTemplate>
<!-- your false template here -->
</DataTemplate>
</local:TrueFalseSelector.FalseTemplate>
</local:TrueFalseSelector>
瞧
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplateSelector="{StaticResource trueFalseSelector}" />
</DataGrid.Columns>
编辑:您可以将DataTemplates放置在当前ViewBox所在的同一词典中。给他们一把钥匙,然后像这样使用:
<local:TrueFalseSelector x:Key="trueFalseSelector"
FalseTemplate="{StaticResource falseTemplate}"
TrueTemplate="{StaticResource trueTemplate">
这里是另一种方法(纯xaml):
这里是另一种方法(纯xaml):
初学者问题:((CustomObjectType)项)
行项
是DataGrid.NewItemPlaceholder
并且我无法访问布尔值(强制转换失败)?此外,如何将xml图像链接到真正的模板中?顺便说一句,感谢您提出的不同方法@ajr,第一个问题取决于如何绑定数据。DataGrid的项资源是什么?第二:与您的ViewBox相同,只需将其放置在DataTemplate中,并从其及其子项中移除键。ItemsSource
是public ICollectionView
,它从实体框架实体加载其成员,实体包含此布尔值。第二个问题:我可以通过它的键引用这个xaml图像吗?我不想把整个星图放到视图.xaml
参考资料中。@ajr,啊,我明白了<代码>新项目占位符
位于新项目应位于的位置。只需检查该类型并返回您希望空“新行”具有的任何值。至于图像,你不必把它放到视图中。您可以将整个选择器或只是数据模板放在任何您想要的字典中-请参阅编辑。好!关于性能,哪种实现成本更低?在ControlTemplate中包装图像时,请按照我的参考帖子中的建议使用IValueConverter(使其正常工作),或者按照其他答案中的建议使用此解决方案或纯xaml方式。初学者问题:((CustomObjectType)项)
linesitem
是DataGrid.NewItemPlaceholder
并且我无法访问布尔值(强制转换失败)?此外,如何将xml图像链接到真正的模板中?顺便说一句,感谢您提出的不同方法@ajr,第一个问题取决于如何绑定数据。DataGrid的项资源是什么?第二:与您的ViewBox相同,只需将其放置在DataTemplate中,并从其及其子项中移除键。ItemsSource
是public ICollectionView
,它从实体框架实体加载其成员,实体包含此布尔值。第二个问题:我可以通过它的键引用这个xaml图像吗?我不想把整个星图放到视图.xaml
参考资料中。@ajr,啊,我明白了<代码>新项目占位符
位于新项目应位于的位置。只需检查该类型并返回您希望空“新行”具有的任何值。至于图像,你不必把它放到视图中。您可以将整个选择器或只是数据模板放在任何您想要的字典中-请参阅编辑。好!关于性能,哪种实现成本更低?在ControlTemplate中包装图像时,请按照我参考帖子中的建议使用IValueConverter(使其正常工作),或者使用此解决方案,或者按照其他答案建议的纯xaml方式。