Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用IValueConverter在多个dataGrid单元中显示相同的xaml格式图像_Wpf_Xaml - Fatal编程技术网

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)项)
lines
item
DataGrid.NewItemPlaceholder
并且我无法访问布尔值(强制转换失败)?此外,如何将xml图像链接到真正的模板中?顺便说一句,感谢您提出的不同方法@ajr,第一个问题取决于如何绑定数据。DataGrid的
项资源是什么?第二:与您的ViewBox相同,只需将其放置在DataTemplate中,并从其及其子项中移除键。
ItemsSource
public ICollectionView
,它从实体框架实体加载其成员,实体包含此布尔值。第二个问题:我可以通过它的键引用这个xaml图像吗?我不想把整个星图放到
视图.xaml
参考资料中。@ajr,啊,我明白了<代码>新项目占位符
位于新项目应位于的位置。只需检查该类型并返回您希望空“新行”具有的任何值。至于图像,你不必把它放到视图中。您可以将整个选择器或只是数据模板放在任何您想要的字典中-请参阅编辑。好!关于性能,哪种实现成本更低?在ControlTemplate中包装图像时,请按照我参考帖子中的建议使用IValueConverter(使其正常工作),或者使用此解决方案,或者按照其他答案建议的纯xaml方式。