В чем разница между этими двумя привязками? - PullRequest
0 голосов
/ 07 марта 2009

Давным-давно я посмотрел на это прохождение MSDN . В нем реализован редактор цвета, а во всплывающей подсказке используется название цвета, например «Красный» или «Синий».

Сегодня я реализую похожий ListBox; он отображает поле с цветом и названием цвета рядом с ним. За исключением моего приложения, все названия цветов отображаются в виде шестнадцатеричных значений, таких как # FFFF0000 и # FF0000FF. Почему?

Вот класс ColorsList, используемый в обоих проектах:

public ColorsList()
{
    Type type = typeof(Colors);
    foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.Static))
    {
        if (propertyInfo.PropertyType == typeof(Color))
        {
            Add((Color)propertyInfo.GetValue(null, null));
        }
    }
}

Этот фрагмент XAML заставляет всплывающую подсказку использовать имя цвета в проекте MSDN (остальную часть кода можно найти в пошаговом руководстве):

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Button Tag="{Binding}" Command="{x:Static PropertyEditing:PropertyValueEditorCommands.ShowInlineEditor}">
            <Button.Template>
                <ControlTemplate>
                    <Border Width="30" Height="30" BorderBrush="Black" BorderThickness="1" CornerRadius="5">
                        <Rectangle Width="22" Height="22" ToolTip="{Binding}">
                            <Rectangle.Fill>
                                <SolidColorBrush Color="{Binding}"/>
                            </Rectangle.Fill>
                        </Rectangle>
                    </Border>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </DataTemplate>
</ItemsControl.ItemTemplate>

Вот мой XAML, который производит шестнадцатеричные коды:

<ListBox x:Name="lstColors" Grid.Row="1" ItemsSource="{StaticResource colors}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Rectangle Stroke="Black"
                           StrokeThickness="3"
                           Width="24"
                           Height="24"
                           RadiusX="5"
                           RadiusY="5">
                    <Rectangle.Fill>
                        <SolidColorBrush Color="{Binding}" />
                    </Rectangle.Fill>
                </Rectangle>
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Это выглядит так же для меня; какая разница?

Ответы [ 2 ]

1 голос
/ 07 марта 2009

Не совсем ответ на ваш вопрос, больше наблюдения:

Если вы измените ColorsList для наследования от ObservableCollection<string> вместо ObservableCollection<Color> и измените следующую строку:

Add((Color)propertyInfo.GetValue(null, null));

до

Add(propertyInfo.Name);

ваш код будет работать так, как вы хотите, чтобы он работал. Вместо преобразования цвета в имя цвета все происходит наоборот - используется встроенное преобразование из имени цвета в цвет.

В качестве примечания я попробовал код XAML из примера MSDN (только ту часть, на которую вы ссылаетесь), но во всплывающих подсказках отображаются коды цветов, а не названия цветов.

0 голосов
/ 09 марта 2009

Оказывается, время разработки отличается от времени выполнения. Пример MSDN используется в качестве расширенного редактора свойств. Я воспользовался советом друга и попытался выставить его как элемент управления во время выполнения, и волшебным образом он получает хэш-имена для цветов вместо дружественных имен. Ухоженная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...