设置DataPmplate内部的TimePicker的日期和时间

时间:2023-02-11 14:18:45

In my wpf application, I've two timePicker controls which are inside DataTemplate.

在我的wpf应用程序中,我有两个timePicker控件,它们位于DataTemplate中。

Xaml:

XAML:

<Controls:MetroWindow 
    x:Class="TimeSheet.DayView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:e="http://schemas.microsoft.com/developer/msbuild/2003"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:TimeSheet.Views.DataTemplateSpace"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    x:Name="MainWin"
    Title="DayView" Width="596" Height="596">

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colours.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
        </ResourceDictionary.MergedDictionaries>

       <!-- <Style x:Key="ColoringStyle" TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding isSynced}" Value="true">
                    <Setter Property="Background" Value="Gold"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding isSynced}" Value="false">
                    <Setter Property="Background" Value="Aqua"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>-->

        <!-- Default DataTemplate -->
        <DataTemplate x:Key="DefaultDataTemplate" >
            <StackPanel Orientation="Horizontal" Width="596">
                <TextBlock Text="{Binding ClientNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="145"/>
                <TextBlock Text="{Binding ApplicationNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="90"/>
                <TextBlock Text="{Binding StartTimeBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="100"/>
                <TextBlock Text="{Binding StopTimeBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="60"/>
                <TextBlock Text="{Binding TaskNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="71"/>
                <TextBlock Text="{Binding ProjectNameBinding}" Background="Transparent" Padding="0" Margin="0" TextWrapping="Wrap" Width="130"/>  
            </StackPanel>
        </DataTemplate>

        <!-- Editable DataTemplate -->
        <DataTemplate x:Key="EditableDataTemplate">
            <StackPanel Orientation="Horizontal" Width="596">
                <!--<ComboBox x:Name="ClientComboBox" SelectionChanged="ClientComboBoxChanged" ItemsSource="{Binding Path=clientList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedItem="{Binding ClientNameBindingClass, Mode=OneWayToSource}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="145"/>-->
                <TextBox Name="CltText" Text="{Binding ClientNameBinding,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="145"/>
                <TextBox Name="AppText" Text="{Binding ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/>
                <xctk:TimePicker Name="StartPicker" Value="{Binding StartValue, ElementName=MainWin, Mode=TwoWay}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="100" EndTime="11:59:0"/>
                <xctk:TimePicker Name="EndPicker" Value="{Binding EndValue, ElementName=MainWin, Mode=TwoWay}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="60" EndTime="11:59:0"/>
                <TextBox Name="TaskText" Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="71"/>
                <ComboBox x:Name="ProjectComboBox" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name"  SelectedItem="{Binding ProjectNameBindingClass, Mode=OneWayToSource}" Width="130" Background="Yellow" BorderThickness="0"/>
            </StackPanel>
        </DataTemplate>


        <!-- DataTemplate Selector -->

        <l:DayViewListDataTemplateSelector x:Key="templateSelector"
          DefaultDataTemplate="{StaticResource DefaultDataTemplate}"
          EditableDataTemplate="{StaticResource EditableDataTemplate}"/>

    </ResourceDictionary>

</Window.Resources>


  <Viewbox Stretch="Fill" Width="{Binding Width, ElementName=MainWin}" Height="{Binding Height, ElementName=MainWin}">
    <Grid Margin="0,0,0,-4" Background="#FF3399FF" Height="557">

        <Button x:Name="BackButton" Style="{DynamicResource MetroCircleButtonStyle}"  Content="&lt;---" Foreground="Blue" Click="BackButton_Click" Margin="7,2,524,491"/>
        <Button x:Name="TimerButton" Width="124" Height="46" Click="TimerButton_Click" Margin="172,12,300,499">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                    <GradientStop Color="#FF5B6CB8"/>
                </LinearGradientBrush>
            </Button.Background>
        </Button>
        <Label x:Name="monthLabel" Content="May" RenderTransformOrigin="2.34,0.545" FontFamily="Times New Roman" FontSize="20" Margin="431,2,90,522"/>
        <Label x:Name="dayDateLabel" Content="Friday, 27" RenderTransformOrigin="0.446,0.226" FontFamily="Times New Roman" FontSize="36" FontWeight="Bold" Margin="376,35,38,467"/>
        <StackPanel Orientation="Horizontal" Margin="-1,93,1,434" RenderTransformOrigin="1.155,0.47" Height="25">
            <TextBox Text="Client" HorizontalContentAlignment="Center" Width="145" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" VerticalContentAlignment="Center"/>
            <TextBox Text="Application" HorizontalContentAlignment="Center" Width="90" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" VerticalContentAlignment="Center"/>
            <TextBox Text="StartTime" HorizontalContentAlignment="Center" Canvas.Left="148" Canvas.Top="86" Width="100" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center"/>
            <TextBox Text="StopTime" HorizontalContentAlignment="Center" Width="60" RenderTransformOrigin="0.471,0.692" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" VerticalContentAlignment="Center"/>
            <TextBox Text="Task" HorizontalContentAlignment="Center" Canvas.Left="378" Canvas.Top="86" Width="130" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" VerticalContentAlignment="Center"/>
            <TextBox Text="Project" HorizontalContentAlignment="Center" Width="71" Foreground="White" Background="Blue" Padding="0" BorderThickness="0" VerticalContentAlignment="Center"/>
        </StackPanel>

        <ListBox x:Name="listBox1" ItemsSource="{Binding}" Margin="0,131,0,59" ItemTemplateSelector="{StaticResource templateSelector}" SelectionMode="Single">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <EventSetter Event="MouseDoubleClick" Handler="listBox1_MouseDoubleClick">
                    </EventSetter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

        <Button x:Name="SyncEntry" Content="Sync All" HorizontalAlignment="Left" Margin="476,498,0,0" VerticalAlignment="Top" Width="95" Click="SyncEntry_Click">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                    <GradientStop Color="#FF5256AC"/>
                </LinearGradientBrush>
            </Button.Background>
        </Button>
        <Button x:Name="EditButton" Content="Edit" HorizontalAlignment="Left" Margin="393,498,0,0" VerticalAlignment="Top" Width="75" Click="EditButton_Click">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                    <GradientStop Color="#FF5256AC"/>
                </LinearGradientBrush>
            </Button.Background>
        </Button>
        <Button x:Name="CustomButton" Content="Add" HorizontalAlignment="Left" Margin="0,70,0,0" VerticalAlignment="Top" Width="75" FontSize="12" Height="20" FontWeight="Normal" Click="CustomButton_Click"/>
    </Grid>
</Viewbox>

</Controls:MetroWindow>

C#:

C#:

public partial class DayView : MetroWindow, INotifyPropertyChanged
{
    private DateTime currentDateForWindow;

    public List<Harvest_Project> projectList{get;set;}

    public List<Harvest_Client> clientList {get; set;}

    public Harvest_Project selectedProjectid {get; set;}

    public Harvest_Client selectedClientid {get; set;}

    public string ElementName { get; set; }

    private DateTime _dateTime1;
    public DateTime StartValue
    {
        get
        {
            return _dateTime1;
        }
        set
        {
            _dateTime1 = value;
            OnPropertyChanged("StartValue");
        }
    }

    private DateTime _dateTime2;
    public DateTime EndValue
    {
        get
        {
            return _dateTime2;
        }
        set
        {
            _dateTime2 = value;
            OnPropertyChanged("EndValue");
        }
    }

    public DayView(DateTime s)
    {
            InitializeComponent();
             this.DataContext = this;

            Globals._globalController.setDayViewWindow(this);

            currentDateForWindow = s;

            dayDateLabel.Content = s.DayOfWeek + ", " + s.Day;
            monthLabel.Content = s.ToString("MMMM");

            if(Globals._globalController.win32Manager.isTimerRunning)
                TimerButton.Content = "Stop";
            else
                TimerButton.Content = "Start";

            listBox1.Items.Clear();

            listBox1.MouseDoubleClick += new MouseButtonEventHandler(listBox1_MouseDoubleClick);
            clientList = Globals._globalController.harvestManager._CLIENTLIST;
            projectList = Globals._globalController.harvestManager._PROJECTLIST;
            Globals._globalController.fetchAndPopulateForDate(currentDateForWindow);

            Globals.ni2 = new NotifyIcon();
            Globals.ni2.Icon = TimeSheet.Properties.Resources.DayViewIcon;
            Globals.ni2.Visible = true;
            Globals.ni2.Click +=
            delegate(object sender, EventArgs args)
            {
                this.Show();
                this.WindowState = WindowState.Normal;

            };

     }

    protected override void OnStateChanged(EventArgs e)
    {
        if (WindowState == System.Windows.WindowState.Minimized)
        {
            this.Hide();
            Globals.ni2.BalloonTipTitle = "DayView";
            Globals.ni2.BalloonTipText = "This is Day window";
            Globals.ni2.Visible = true;
            Globals.ni2.ShowBalloonTip(500);
            base.OnStateChanged(e);
        }
    }

    public void addHarvestEntrytoView(Harvest_TimeSheetEntry entry)
    {

          listBox1.Items.Add(entry);

    }

    public void addHarvestEntrytoView(List<Harvest_TimeSheetEntry> entry)
    {
        foreach (Harvest_TimeSheetEntry x in entry)
            listBox1.Items.Add(x);
    }

    private void BackButton_Click(object sender, RoutedEventArgs e)
    {
            Globals.ni2.Visible=false;
            this.Hide();
            Globals._globalController.getMonthViewWindow.Show();
            Globals.ni1.Visible = true;
    }

    private void TimerButton_Click(object sender, RoutedEventArgs e)
    {
        if (!Globals._globalController.win32Manager.isTimerRunning)
        {
            Globals._globalController.win32Manager.startTimer();
            this.TimerButton.Content = "Stop";
        }
        else
        {
            Globals._globalController.win32Manager.stopTimer();
            this.TimerButton.Content = "Start";
        }
    }


    private void SyncEntry_Click(object sender, RoutedEventArgs e)
    {
        //Submit All unsynced Entries

        foreach(Harvest_TimeSheetEntry item in listBox1.Items)
       {
           if (!item.isSynced)
           {
               if (item.ProjectNameBinding == "Select Project" && item.ClientNameBinding == "Select Client")
                   System.Windows.MessageBox.Show("Please select you Project and Client");
               else
               //Check if something is selected in selectedProjectItem For that item
               Globals._globalController.harvestManager.postHarvestEntry(item);
               System.Windows.MessageBox.Show("Entry posted");
           }
       }

    }



    private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        //Submit clicked Entry
        if (sender is ListBoxItem)
        {
            ListBoxItem item = (ListBoxItem)sender;
            Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)item.DataContext;

            if (!entryToPost.isSynced)
            {
                //Check if something is selected in selectedClientItem and selectedProjectItem For that items
                if (entryToPost.ClientNameBinding == "Select Client" || entryToPost.ProjectNameBinding == "Select Project")
                    System.Windows.MessageBox.Show("Please select you Project and Client");
                else
                {
                    Globals._globalController.harvestManager.postHarvestEntry(entryToPost);
                    System.Windows.MessageBox.Show("Entry posted");
                    DataTemplate tmpl = (DataTemplate)this.FindResource("DefaultDataTemplate");
                    listBox1.ItemTemplate = tmpl;
                }
            }
            else
            {

                //Already synced.. Make a noise or something
                System.Windows.MessageBox.Show("Already Synced;TODO Play a Sound Instead");
            }
        }


     }

    private void EditButton_Click(object sender, RoutedEventArgs e)
    {
        if (EditButton.Content == "Edit")
        {
            listBox1.ItemTemplate = (DataTemplate)this.FindResource("EditableDataTemplate");
            EditButton.Content = "Done Editing";
        }
        else
        {
            foreach (Harvest_TimeSheetEntry item in listBox1.Items)
            {
                Globals._globalController.harvestManager.updateHarvestTimeSheetEntry(item);
                if (!item.isSynced)
                {
                    if (ValidateEntry(item))
                    if (IsValidTime(StartValue.ToString()) && IsValidTime(EndValue.ToString()))
                    Globals._globalController.harvestManager.postHarvestEntry(item);
                    System.Windows.MessageBox.Show("Entry posted");
                }

            }
            EditButton.Content = "Edit";
            listBox1.ItemTemplate = (DataTemplate)this.FindResource("DefaultDataTemplate");
         }
    }

    private bool ValidateEntry(Harvest_TimeSheetEntry ent)
    {
        bool IsValid = true;

        if (ent.ClientNameBinding == null || ent.TaskNameBinding == null || ent.ProjectNameBinding == null) throw new ArgumentNullException();
        {
            IsValid = false;
        }

        return IsValid;
    }

    public bool IsValidTime(string time)
    {
        Regex checktime =
            new Regex(@"^(20|21|22|23|[01]d|d)(([:][0-5]d){1,2})$");

        return checktime.IsMatch(time);
    }

    private void CustomButton_Click(object sender, RoutedEventArgs e)
    {
        Globals.ni2.Visible=false;
        CustomView c = new CustomView(Globals._globalController.getDayViewWindow);
        c.Show();
        this.Hide();
        Globals.ni3.Visible = true;
    }

    public void OnPropertyChanged(String time)
    {
        if (System.String.IsNullOrEmpty(time))
        {
            return;
        }
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(time));
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

I want to set Date and Time for them. I know that following two lines will set date and time for them if, they are not inside DataTemplate.

我想为他们设置日期和时间。我知道如果它们不在DataTemplate中,那么下面两行将为它们设置日期和时间。

StartPicker.Value = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute,DateTime.Now.Second);
EndPicker.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);

Because these TimePickers are inside DataTemplate, these are not accesible in my code behind. Can anyone suggest some ways for setting date and time in this situation?

因为这些TimePickers在DataTemplate中,所以这些在我的代码后面是不可访问的。在这种情况下,有人可以建议一些设置日期和时间的方法吗?

1 个解决方案

#1


0  

i think i got the solution actually what is happening here is this. you have set your ListBox.ItemsSource property to some list or collection so your ListBoxItem Datacontext is set to this list and hence its EditableDataTemplate that contain TimePicker search its binding properties(startValue and endValue) in your List or Collection but actually these property is outside the List or in your page.cs.so you have to set the Relativesource property of TimePIcker like this ..

我想我得到的解决方案实际上这里发生的是这个。您已将ListBox.ItemsSource属性设置为某个列表或集合,因此ListBoxItem Datacontext设置为此列表,因此其包含TimePicker的EditableDataTemplate在List或Collection中搜索其绑定属性(startValue和endValue),但实际上这些属性位于列表或在你的page.cs.so你必须像这样设置TimePIcker的Relativesource属性..

 <DataTemplate x:Key="sample" >
        <xctk:TimePicker Name="StartPicker" Value="{Binding DateTime, Mode=TwoWay,RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="100" EndTime="11:59:0"/>
    </DataTemplate>

if you want all the item's startTime and EndTime to be different then make a separate class that contain StartTime and EndTime Property. and make a list of these objects and bind that list to your listBox ..hope you getting this..sorry for my bad english

如果您希望所有项的startTime和EndTime不同,则创建一个包含StartTime和EndTime属性的单独类。并列出这些对象并将该列表绑定到您的listBox ..希望你得到这个......我的英语不好

#1


0  

i think i got the solution actually what is happening here is this. you have set your ListBox.ItemsSource property to some list or collection so your ListBoxItem Datacontext is set to this list and hence its EditableDataTemplate that contain TimePicker search its binding properties(startValue and endValue) in your List or Collection but actually these property is outside the List or in your page.cs.so you have to set the Relativesource property of TimePIcker like this ..

我想我得到的解决方案实际上这里发生的是这个。您已将ListBox.ItemsSource属性设置为某个列表或集合,因此ListBoxItem Datacontext设置为此列表,因此其包含TimePicker的EditableDataTemplate在List或Collection中搜索其绑定属性(startValue和endValue),但实际上这些属性位于列表或在你的page.cs.so你必须像这样设置TimePIcker的Relativesource属性..

 <DataTemplate x:Key="sample" >
        <xctk:TimePicker Name="StartPicker" Value="{Binding DateTime, Mode=TwoWay,RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="100" EndTime="11:59:0"/>
    </DataTemplate>

if you want all the item's startTime and EndTime to be different then make a separate class that contain StartTime and EndTime Property. and make a list of these objects and bind that list to your listBox ..hope you getting this..sorry for my bad english

如果您希望所有项的startTime和EndTime不同,则创建一个包含StartTime和EndTime属性的单独类。并列出这些对象并将该列表绑定到您的listBox ..希望你得到这个......我的英语不好