Wpf 绑定到一个字符串值,然后该字符串值应该绑定到一个资源,这有什么不对?
我有一个具有以下属性的类: 消息(字符串)、已添加(日期时间)和日志级别(字符串) 在我的App.xaml中,我有以下内容:Wpf 绑定到一个字符串值,然后该字符串值应该绑定到一个资源,这有什么不对?,wpf,data-binding,xaml,Wpf,Data Binding,Xaml,我有一个具有以下属性的类: 消息(字符串)、已添加(日期时间)和日志级别(字符串) 在我的App.xaml中,我有以下内容: <Application.Resources> <ImageSource x:Key="Critical">Gfx/Log/Critical.png</ImageSource> <ImageSource x:Key="Info">Gfx/Log/Information.png</ImageSource&
<Application.Resources>
<ImageSource x:Key="Critical">Gfx/Log/Critical.png</ImageSource>
<ImageSource x:Key="Info">Gfx/Log/Information.png</ImageSource>
<ImageSource x:Key="Error">Gfx/Log/Error.png</ImageSource>
<ImageSource x:Key="Warning">Gfx/Log/Warning.png</ImageSource>
</Application.Resources>
所以。。。日志级别已绑定到网格。。。但是我的图像没有显示。。。我不知道这样做是否正确。。。或者有更好的方法。。。也许我的代码中有个bug
我甚至不知道如何调试它,因为它是xaml,我刚刚开始使用它
任何帮助都是非常感激的
这是我的第一篇“Stackoverflow”帖子。。。因此,如果成型不完美。。。我将学习我的这个 使用DataTemplate
是正确的方法。不要在图像中指定源
,而是添加一些触发器
s:
<DataTemplate>
<Image x:Name="myImage" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding LogLevel}" Value="Critical">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Critical}"/>
</DataTrigger>
</DataTemplate.Triggers>
<!--others triggers here-->
</DataTemplate>
使用数据模板是正确的方法。不要在图像中指定源
,而是添加一些触发器
s:
<DataTemplate>
<Image x:Name="myImage" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding LogLevel}" Value="Critical">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Critical}"/>
</DataTrigger>
</DataTemplate.Triggers>
<!--others triggers here-->
</DataTemplate>
所以。。。它现在正在使用以下代码。。。太好了
但是,当我在多个页面上使用此数据模板时,如何将其移动到资源中。阅读前一段时间的一些文章,其中提到可以重用DataTemplate,并指定要使用的模板。。。但我似乎可以找到任何xaml标记,在那里我可以放置用于此“Imagetemplate”的模板
这可能很好,因为我不必在所有其他地方都指定它,而且我有一个中心位置可以对它进行更改…:-)
解决方案:
<my:DataGridTemplateColumn Header="Level" CellTemplate="{StaticResource ImageLevels}"></my:DataGridTemplateColumn>
在App.xaml中
<Application.Resources>
<DataTemplate x:Key="ImageLevels">
<Image x:Name="myImage" Height="20" Width="20" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding LogLevel}" Value="Info">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Information}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Warning">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Warning}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Error">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Error}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Critical">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Critical}"/>
</DataTrigger>
</DataTemplate.Triggers>
<!--others triggers here-->
</DataTemplate>
</Application.Resources>
所以。。。它现在正在使用以下代码。。。太好了
但是,当我在多个页面上使用此数据模板时,如何将其移动到资源中。阅读前一段时间的一些文章,其中提到可以重用DataTemplate,并指定要使用的模板。。。但我似乎可以找到任何xaml标记,在那里我可以放置用于此“Imagetemplate”的模板
这可能很好,因为我不必在所有其他地方都指定它,而且我有一个中心位置可以对它进行更改…:-)
解决方案:
<my:DataGridTemplateColumn Header="Level" CellTemplate="{StaticResource ImageLevels}"></my:DataGridTemplateColumn>
在App.xaml中
<Application.Resources>
<DataTemplate x:Key="ImageLevels">
<Image x:Name="myImage" Height="20" Width="20" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding LogLevel}" Value="Info">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Information}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Warning">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Warning}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Error">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Error}"/>
</DataTrigger>
<DataTrigger Binding="{Binding LogLevel}" Value="Critical">
<Setter TargetName="myImage" Property="Source" Value="{StaticResource Critical}"/>
</DataTrigger>
</DataTemplate.Triggers>
<!--others triggers here-->
</DataTemplate>
</Application.Resources>
看看我的扩展:它将使您的原始代码几乎不做任何更改:
<my:DataGrid Grid.Column="0" Grid.Row="1" AutoGenerateColumns="False" Name="userLogGrid" xmlns:ff="clr-namespace:WpfExtensions;assembly=WpfExtensions">
<my:DataGrid.Columns>
<my:DataGridTextColumn Header="Added" Binding="{Binding Added}" />
<my:DataGridTextColumn Header="Message" Binding="{Binding Message}" />
<my:DataGridTextColumn Header="Message" Binding="{Binding LogLevel}" />
<my:DataGridTemplateColumn Header="Level">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{ff:ResourceKeyBinding Path=LogLevel}" />
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>
看看我的扩展:它将使您的原始代码几乎不做任何更改:
<my:DataGrid Grid.Column="0" Grid.Row="1" AutoGenerateColumns="False" Name="userLogGrid" xmlns:ff="clr-namespace:WpfExtensions;assembly=WpfExtensions">
<my:DataGrid.Columns>
<my:DataGridTextColumn Header="Added" Binding="{Binding Added}" />
<my:DataGridTextColumn Header="Message" Binding="{Binding Message}" />
<my:DataGridTextColumn Header="Message" Binding="{Binding LogLevel}" />
<my:DataGridTemplateColumn Header="Level">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{ff:ResourceKeyBinding Path=LogLevel}" />
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>
什么是日志级别?资源或DataContext属性?它是ObserableCollection中类的字符串属性什么是LogLevel?资源还是DataContext属性?它是ObsableCollection中类的字符串属性我将研究它。。。如果我有什么问题就回来。WPF是伟大的。。。你只需要知道所有聪明的做事方法,希尔:-)我会调查的。。。如果我有什么问题就回来。WPF是伟大的。。。你只需要知道所有聪明的方法来做事情,希尔:-)你应该把这作为一个单独的问题,因为你不能把两个答案标记为有效。我不完全理解你,你自己找到解决问题的方法了吗?你应该把这个问题作为一个单独的问题发布,因为你不能把两个答案标记为有效。我不完全理解你,你自己找到解决问题的办法了吗?