IValueConverter возвращает массив int - PullRequest
0 голосов
/ 21 декабря 2018

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

object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    int[] days = new int[] { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };
    return days;
}

и это xaml:

<ContentPresenter
x:Name="NormalText"
Content="{Binding Converter={StaticResource GeorgianToPersianDate}}"
/>

enter image description here

ОБНОВЛЕНИЕ:

<Style x:Key="CalendarDayButtonStyle" TargetType="CalendarDayButton">

        <Setter Property="MinWidth" Value="10" />
        <Setter Property="MinHeight" Value="10" />
        <Setter Property="FontSize" Value="12" />
        <Setter Property="Width" Value="32" />
        <Setter Property="Height" Value="32" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CalendarDayButton">
                    <ControlTemplate.Resources>
                        <local:GeorgianToPersianDate x:Key="GeorgianToPersianDate" />
                    </ControlTemplate.Resources>
                    <Grid>
                        <Rectangle
                            x:Name="TodayBackground"
                            Fill="{DynamicResource DangerBrush}"
                            Opacity="0"
                            RadiusX="16"
                            RadiusY="16" />
                        <Rectangle
                            x:Name="SelectedBackground"
                            Fill="{DynamicResource PrimaryBrush}"
                            Opacity="0"
                            RadiusX="16"
                            RadiusY="16" />
                        <ContentPresenter
                            x:Name="NormalText"
                            Content="{Binding Converter={StaticResource GeorgianToPersianDate}}"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                            <TextElement.Foreground>
                                <SolidColorBrush Color="{DynamicResource PrimaryTextColor}" />
                            </TextElement.Foreground>
                        </ContentPresenter>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.1" />
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <DoubleAnimation
                                            Storyboard.TargetName="NormalText"
                                            Storyboard.TargetProperty="Opacity"
                                            To=".35"
                                            Duration="0" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0" />
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Unselected" />
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <DoubleAnimation
                                            Storyboard.TargetName="SelectedBackground"
                                            Storyboard.TargetProperty="Opacity"
                                            To="1"
                                            Duration="0:0:.2" />
                                        <ColorAnimation
                                            Storyboard.TargetName="NormalText"
                                            Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
                                            To="White"
                                            Duration="0" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="ActiveStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0" />
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Active" />
                                <VisualState x:Name="Inactive">
                                    <Storyboard>
                                        <ColorAnimation
                                            Storyboard.TargetName="NormalText"
                                            Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
                                            To="{DynamicResource ThirdlyTextColor}"
                                            Duration="0" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="DayStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0" />
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="RegularDay" />
                                <VisualState x:Name="Today">
                                    <Storyboard>
                                        <DoubleAnimation
                                            Storyboard.TargetName="TodayBackground"
                                            Storyboard.TargetProperty="Opacity"
                                            To="1"
                                            Duration="0" />
                                        <ColorAnimation
                                            Storyboard.TargetName="NormalText"
                                            Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
                                            To="White"
                                            Duration="0" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

это мой xaml. Я просто хочу удалить дни по умолчанию и добавить свои собственные дни. Я думал, что смогу сделать это с помощью конвертера.Так как я могу изменить дни, если я не могу сделать это с конвертером?

1 Ответ

0 голосов
/ 21 декабря 2018

Сначала давайте начнем с привязки.

A ContentPresenter представляет свой пользовательский интерфейс через свойство Content.Это просто object.В XAML есть несколько причудливых способов перевода определенных объектов в визуальные объекты, но в случае неудачи он просто вызывает ToString() для этого object и отображает текст.Глядя на свой IValueConverter, вы возвращаете int[], и Content становится этим.Почему это не показывает System.Int32[] неизвестно с кодом, который вы дали, но это то, что происходит.

Итак, зная, что давайте посмотрим на ваш IValueConverter.

Вы возвращаете array из int (int[]).Теперь это System.Int32[], когда вы звоните ToString().

Если вы Template были типом, который содержал несколько элементов, таких как ItemsControl, тогда назначение ItemsSource автоматически делает то же самое, но длякаждый элемент в массиве.

Использование IValueConverter неверно.Это ничего не конвертирует и не то, для чего используется конвертер.Вам просто нужно сделать чистую привязку к свойству в ViewModel или где-либо еще, но не использовать для этого IValueConverter.

Конвертер используется, когда у вас уже есть какая-то привязка;но я не хочу использовать результат этой привязки и предпочел бы «преобразовать» этот результат во что-то еще.

Например: если вы хотите связать свойство, которое вернуло значение intно предпочел бы преобразовать это int в связанное enum имя;тогда вы бы написали конвертер, который читает в int и возвращает соответствующее enum имя.

Исправление:

Трудно дать с XAML, который выпредоставил, но знаю, что есть несколько способов сделать это.Первый;вам нужно иметь хотя бы шаблон, который исключает массив в качестве привязки, чтобы отображать их такими, какие они есть.Глядя на ваше изображение, я не верю, что это для вас.Я полагаю, вы уже добавили ContentControl в шаблон;и этот шаблон является частью ItemsSource другого элемента управления.Если это так, то вы должны связать ItemsSource с массивом;и в ContentPresenter просто привязка к данным, которые приходят к нему, вот так:

<ContentPresenter x:Name="NormalText"
                  Content="{Binding}"/>

Все, что сказано;Я не могу дать вам однозначное и правильное решение, не видя общий XAML.


После обновления я считаю, что проблема в том, что вы стилизуете CalenderButton и присваиваете Contentтам к массиву.Напишите привязку, как я делал выше;затем пользовательский Style Calendar и установите привязку к массиву.Я никогда не делал стиль Календаря, но, просматривая его, я могу сказать, что Calendar имеет panel и ItemsSource некоторой моды, а шаблон этих элементов - CalendarButton.Другими словами, дни распределяются по кнопкам из календаря, и вы пытаетесь сделать это непосредственно с кнопки.

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