Привязка к строковому значению, которое затем должно быть привязано к ресурсу, что здесь не так? - PullRequest
1 голос
/ 18 ноября 2009

У меня есть класс со следующими свойствами: Сообщение (строка), Добавлено (DateTime) и LogLevel (строка)

В моем 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>

LogLevel в вышеприведенном классе может иметь одно из следующих 4 значений ресурса ImageSource, определенных в файле app.xaml.

Я использую WPF Toolkit из codeplex: текст ссылки

<my:DataGrid Grid.Column="0" Grid.Row="1" AutoGenerateColumns="False" Name="userLogGrid">
    <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="{DynamicResource {Binding LogLevel}}" />
                </DataTemplate>
            </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>
    </my:DataGrid.Columns>
</my:DataGrid>

Итак ... LogLevel привязаны к сетке ... но мое изображение не отображается ... Я понятия не имею, правильно ли это сделать ... или есть лучшие способы ... возможно у меня ошибка в коде ....

Я даже не уверен, как это отладить, так как его xaml, и я только начал его использовать ...

Любая помощь очень ценится ...

Это мой первый пост "Stackoverflow" ... так что если форматирование не идеально ... Я научусь этому ...

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Использование DataTemplate - верный способ сделать это. Не указывайте Source на изображении, но добавьте Trigger 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>
0 голосов
/ 04 января 2010

Взгляните на мое ResourceKeyBinding расширение: оно сделает ваш оригинальный код практически без изменений:

<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>
0 голосов
/ 19 ноября 2009

Итак ... теперь он работает со следующим кодом ... GREAT.

Но поскольку я использую этот шаблон данных на нескольких страницах, как я могу переместить его в ресурсы. Где-то недавно читал, что можно повторно использовать DataTemplate и уточнить шаблон для использования ... но я могу найти любой из тегов xaml, где я могу поместить какой шаблон использовать для этого "Imagetemplate"

Может быть очень приятно, так как мне не нужно указывать это все остальные места, и у меня есть центральное место для внесения изменений в него ...: -)

<my:DataGrid Grid.Column="0" Grid.Row="1" AutoGenerateColumns="False" Name="userLogGrid">
    <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 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>
            </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>
    </my:DataGrid.Columns>
</my:DataGrid>

Решение:

<my:DataGridTemplateColumn Header="Level" CellTemplate="{StaticResource ImageLevels}"></my:DataGridTemplateColumn>

В приложении. 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>
...