Как использовать конвертер для текстового блока календаря? - PullRequest
0 голосов
/ 04 января 2019

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

Тогда пример, который я нашел, таков:

<Window x:Class="CalendarioNumeroSemana.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CalendarioNumeroSemana"
        xmlns:app="clr-namespace:CalendarioNumeroSemana"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Calendar Grid.IsSharedSizeScope="True" HorizontalAlignment="Left" Margin="209,116,0,0" VerticalAlignment="Top">
            <Calendar.CalendarDayButtonStyle>
                <Style TargetType="{x:Type CalendarDayButton}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=(Grid.Column),RelativeSource={RelativeSource Mode=Self}}" 
                                     Value="0">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <Grid HorizontalAlignment="Right">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition SharedSizeGroup="XX"/>
                                                <ColumnDefinition SharedSizeGroup="YY"/>
                                            </Grid.ColumnDefinitions>
                                            <Border  BorderThickness="0,0,0,0" BorderBrush="Black" Margin="-15,0,0,0">
                                                <TextBlock  Margin="0,0,2,0" FontWeight="Bold">
                                                    <TextBlock.Text>
                                                        <Binding Path="DataContext">
                                                            <Binding.Converter>
                                                                <app:WeekNumberConverter />
                                                            </Binding.Converter>
                                                            <Binding.RelativeSource>
                                                                <RelativeSource Mode="FindAncestor"
                                                                                AncestorType="{x:Type CalendarDayButton}"/>
                                                            </Binding.RelativeSource>
                                                        </Binding>
                                                    </TextBlock.Text>
                                                </TextBlock>
                                            </Border>
                                            <TextBlock Text="{Binding }" Grid.Column="1" HorizontalAlignment="Center"/>
                                        </Grid>
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>

                </Style>
            </Calendar.CalendarDayButtonStyle>
        </Calendar>

    </Grid>
</Window>



namespace CalendarioNumeroSemana
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }




    public class WeekNumberConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is DateTime)
            {
                DateTime dt = (DateTime)value;
                return getNumeroSemenaIso8601(dt);
            }
            return value;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }





        private int getNumeroSemenaIso8601(DateTime paramFecha)
        {
            System.Globalization.Calendar miCalendario = CultureInfo.InvariantCulture.Calendar;

            DateTime miDtFechaBase = paramFecha;

            DayOfWeek miDiaSemana = miCalendario.GetDayOfWeek(paramFecha);


            if (miDiaSemana == DayOfWeek.Monday) { miDtFechaBase = miDtFechaBase.AddDays(3); }

            if (miDiaSemana == DayOfWeek.Tuesday) { miDtFechaBase = miDtFechaBase.AddDays(2); }

            if (miDiaSemana == DayOfWeek.Wednesday) { miDtFechaBase = miDtFechaBase.AddDays(1); }

            if (miDiaSemana == DayOfWeek.Friday) { miDtFechaBase = miDtFechaBase.AddDays(-1); }

            if (miDiaSemana == DayOfWeek.Saturday) { miDtFechaBase = miDtFechaBase.AddDays(-2); }

            if (miDiaSemana == DayOfWeek.Sunday) { miDtFechaBase = miDtFechaBase.AddDays(-3); }


            return miCalendario.GetWeekOfYear(miDtFechaBase, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        }
    }
}

Но я бы хотел использовать это в своем приложении, чтобы оно использовало MVVM, и у меня есть конвертер для получения номера недели в другом классе.

Мой axml такой:

<Calendar Grid.IsSharedSizeScope="True" HorizontalAlignment="Left" Margin="5,5,5,5" Padding="0,0,0,0" VerticalAlignment="Top">
    <Calendar.CalendarDayButtonStyle>
        <Style TargetType="{x:Type CalendarDayButton}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=(Grid.Column),RelativeSource={RelativeSource Mode=Self}}" 
                         Value="0">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Grid HorizontalAlignment="Right">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition SharedSizeGroup="XX"/>
                                        <ColumnDefinition SharedSizeGroup="YY"/>
                                    </Grid.ColumnDefinitions>
                                    <Border  BorderThickness="0,0,0,0" BorderBrush="Black" Margin="-15,0,0,0">
                                        <TextBlock  Margin="0,0,2,0" FontWeight="Bold">
                                            <TextBlock.Text>
                                                <Binding Path="DataContext">
                                                    <Binding.Converter>
                                                        <app:WeekNumberConverter />
                                                    </Binding.Converter>
                                                    <Binding.RelativeSource>
                                                        <RelativeSource Mode="FindAncestor"
                                                                    AncestorType="{x:Type CalendarDayButton}"/>
                                                    </Binding.RelativeSource>
                                                </Binding>
                                            </TextBlock.Text>
                                        </TextBlock>
                                    </Border>
                                    <TextBlock Text="{Binding }" Grid.Column="1" HorizontalAlignment="Center"/>
                                </Grid>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Calendar.CalendarDayButtonStyle>
</Calendar>

Моя главная проблема в том, что я не знаю, как изменить код binding.text, и позже в TextBlock Text он использует Binding, но я не знаю, что это за связывание.

Я пробовал что-то подобное:

<TextBlock.Text>
                                                            <Binding Converter="{StaticResource NumeroSemanaValueConverter}"/>
                                                        </TextBlock.Text>

Но в конвертере я не получаю дату, я получаю день первой кнопки. Мне нужна дата.

Так, как я мог приспособить оригинальный код к моему случаю?

Спасибо.

1 Ответ

0 голосов
/ 04 января 2019

Это не имеет ничего общего с MVVM. Это чистая логика управления. Шаблон элемента управления использует конвертер для получения номера недели. Конвертер - это просто класс, а шаблон - это просто шаблон.

Таким образом, найденный вами пример, безусловно, может быть использован в приложении MVVM. Это просто встроенный элемент управления с пользовательским шаблоном. Насколько я вижу, модель представления или логика, которая должна принадлежать модели представления, не задействована.

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