Wpf 绑定到一个字符串值,然后该字符串值应该绑定到一个资源,这有什么不对?

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&

我有一个具有以下属性的类: 消息(字符串)、已添加(日期时间)和日志级别(字符串)

在我的App.xaml中,我有以下内容:

<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是伟大的。。。你只需要知道所有聪明的方法来做事情,希尔:-)你应该把这作为一个单独的问题,因为你不能把两个答案标记为有效。我不完全理解你,你自己找到解决问题的方法了吗?你应该把这个问题作为一个单独的问题发布,因为你不能把两个答案标记为有效。我不完全理解你,你自己找到解决问题的办法了吗?