Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为日历的文本块使用转换器?_C#_Wpf_Data Binding - Fatal编程技术网

C# 如何为日历的文本块使用转换器?

C# 如何为日历的文本块使用转换器?,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在尝试在日历控件中添加一个新列以添加周数。我发现了一个完美的例子,问题很简单,它使用代码隐藏,我想在另一个类中使用MVVM和转换器,而不是代码隐藏 我发现的例子是: <Window x:Class="CalendarioNumeroSemana.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micr

我正在尝试在日历控件中添加一个新列以添加周数。我发现了一个完美的例子,问题很简单,它使用代码隐藏,我想在另一个类中使用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中,它使用绑定,但我不知道这是什么绑定

我试过这样的方法:

<TextBlock.Text>
                                                            <Binding Converter="{StaticResource NumeroSemanaValueConverter}"/>
                                                        </TextBlock.Text>
但是在转换器中,我没有日期,我设置了第一个按钮的日期。我需要日期

那么,我如何使原始代码适应我的情况呢


谢谢。

这与MVVM无关。这是纯粹的控制逻辑。控件的模板使用转换器获取周数。转换器只是一个类,模板只是一个模板

因此,您找到的示例肯定可以在MVVM应用程序中使用。它只是一个带有自定义模板的内置控件。据我所知,没有涉及任何应该属于视图模型的视图模型或逻辑