DateTime при выборе столбца меняется возраст

95
12 июля 2021, 15:20

Есть два столбца, в столбце Год рождения, когда устанавливается дата то в столбце Возраст на: возраст меняется. Подскажите пожалуйста, как сделать что бы в Header Возраст на: когда меняешь дату, независимо от столбца Год рождения, менялась дата в столбце ячеек Возраст на:?

public class MainViewModel : OnPropertyChangedClass
{
    ObservableCollection<Model> allModel = new ObservableCollection<Model>();
    public ObservableCollection<Model> AllModel
    {
        get
        {
            return allModel;
        }
        set
        {
            allModel = value;
            OnAllPropertyChanged();
        }
    }
    DateTime dateNow = DateTime.Now.AddDays(0);
    public DateTime DateNow
    {
        get => dateNow; set { dateNow = value; OnAllPropertyChanged(); }
    }
}

  public class Model : OnPropertyChangedClass
{
    string age;
    public string Age
    {
        get => CalculateAge(DateOfBirthAndMonth); set { age = value; OnAllPropertyChanged(); }
    }
    DateTime dateOfBirthAndMonth = new DateTime(2000, 01, 01);
    public DateTime DateOfBirthAndMonth
    {
        get => dateOfBirthAndMonth;
        set
        {
            dateOfBirthAndMonth = value;
            OnAllPropertyChanged();
        }
    }
    public string CalculateAge(DateTime DateOfBirth)
    {
        TimeSpan timeSpan = DateTime.Now - DateOfBirth;
        DateTime age = new DateTime(timeSpan.Ticks);
        int years = age.Year - 1;
        int month = age.Month - 1;
        string result = String.Format("{0},{1}", years, month);
        return result;
    }
}

}

<Window x:Class="SwitchBetweenDateTime.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:SwitchBetweenDateTime"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>
<Grid>
    <DataGrid ItemsSource="{Binding AllModel}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Age" Binding="{Binding Age, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                                Header="Возраст на: " IsReadOnly="True">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Width="Auto">
                            <Label Content="{Binding Content, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                            <DatePicker SelectedDate="{Binding DataContext.DateNow, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTemplateColumn Header="Год рождения">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DateOfBirthAndMonth, StringFormat=dd.MM.yyyy}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding DateOfBirthAndMonth}" Height="Auto"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Answer 1

Необходимо исправить код вычисления возраста:

public string CalculateAge(DateTime DateNow, DateTime DateOfBirth)
{
    //Вам нужно отсчитывать возраст от выбранной даты
    //в DateTimePicker из заголовка столбца "Возраст на" и
    //передавать в эту функцию свойство DateNow из MainViewModel
    TimeSpan timeSpan = DateNow - DateOfBirth;/*DateTime.Now - DateOfBirth;*/
    DateTime age = new DateTime(timeSpan.Ticks);
    int years = age.Year - 1;
    int month = age.Month - 1;
    string result = String.Format("{0},{1}", years, month);
    return result;
}

Вариант без использования интерфейса INotifyPropertyChanged - подписаться на событие OnValueChanged у DateTimePicker'а "Возраст на" и вызывать функцию CalculateAge у каждого объекта типа Model в Grid.

 yourDateTimePickerName.ValueChanged += picker_OnValueChanged;
 public void picker_OnValueChanged(Object sender, EventArgs e)
 {
   DateTimePicker current = sender as DateTimePicker;
   foreach(var item in myGrid)//myGrid контейнер для элементов типа Model
   {
      if(item is Model)
      {
        Model tmp = item as Model;
        tmp.CalculateAge(current.Value, tmp.dateOfBirthAndMonth);
      }
   }
}
READ ALSO
Сравнение BigInteger и int, short в C#

Сравнение BigInteger и int, short в C#

Пытаюсь разобраться в принципе работы

86
Целесообразность класса для работы с БД MSSQL

Целесообразность класса для работы с БД MSSQL

Создал специальный вспомогательный класс для соединения и работы с БД

70
Как реализовать программу?

Как реализовать программу?

Прошу помощи в разработке программы, оригинал на паскале написан и на 32/64 не переписать его и не запустить (досбоксы и тому подобное не подходит)Надо...

94
Ошибка в запросe (1054): Unknown column &#39;g.RomNo&#39; in &#39;field list&#39;

Ошибка в запросe (1054): Unknown column 'g.RomNo' in 'field list'

Ошибка в запросe (1054): Unknown column 'gRomNo' in 'field list'

90