2016-11-05 96 views
0

我有一点windowdatepickerlabel。目标是显示出生日期被挑选的人的年龄。我正在使用MVVM light,我需要使用ViewModel.cs。我可以只用XAML吗?如果不是,如何解决这个问题?WPF显示年龄从datepicker使用数据绑定

我的视图模型:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using GalaSoft.MvvmLight; 
using System.Windows.Controls; 

namespace zh1_beteges 
{ 
    public class PatientVM : ViewModelBase 
    { 
     Patient b = null; 

     int age; 
     DatePicker DP; 
     public int Age 
     { 
      get { return age; } 
      set { Set(ref age, value); } 
     } 
     public Patient B 
     { 
      get 
      { 
       return b; 
      } 
      set { Set(ref b, value); } 
     } 
     public PatientVM(DatePicker DP) 
     { 
      this.DP = DP; 
     } 
     public PatientVM(Patient b, DatePicker DP) 
     { 
      this.B = b; 
      this.DP = DP; 
      age = DateTime.Today.Year - b.DateOfBirth.Year; 
     } 


    } 
} 

和我的XAML:

<Window x:Class="zh1_beteges.BetegAdatai" 
    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:zh1_beteges" 
    mc:Ignorable="d" 
    Title="BetegAdatai" Height="314.894" Width="512.766" 
    WindowStartupLocation="CenterScreen" 
    > 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="0.7*"/> 
     <ColumnDefinition Width="0.7*"/> 
    </Grid.ColumnDefinitions> 
    <Label Content="Patient name:" HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="0" Grid.Column="0"> 
    </Label> 
    <Label Content="PlaceOfBirth: " HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="1" Grid.Column="0"> 
    </Label> 
    <Label Content="date of birth:" HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="2" Grid.Column="0"> 
    </Label> 
    <Label Content="TAJ:" HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="3" Grid.Column="0"> 
    </Label> 
    <Label Content="Age:" HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="2" Grid.Column="2"> 
    </Label> 
    <Label Content="{Binding Path=Age}" HorizontalAlignment="Left" VerticalAlignment="Center" 
      FontSize="14" Margin="10,0,10,0" Grid.Row="2" Grid.Column="3"> 
    </Label> 
    <Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="4" Margin="170,5,170,5" 
      Content="OK" FontSize="14"> 
    </Button> 
    <DatePicker x:Name="DP" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" 
       VerticalAlignment="Center" DisplayDateStart="2016/01/01" 
       SelectedDate="{Binding Path=B.SzuletesiDatum}"> 
    </DatePicker> 
    <TextBox Margin="10,5,10,5" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3" 
      Text="{Binding Path=B.Name}" VerticalContentAlignment="Center" > 
    </TextBox> 
    <TextBox Margin="10,5,10,5" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3" 
      Text="{Binding Path=B.PlaceOfBirth}" VerticalContentAlignment="Center" > 
    </TextBox> 
    <TextBox Margin="10,5,10,5" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="3" 
      Text="{Binding Path=B.TAJ}" VerticalContentAlignment="Center"> 
    </TextBox> 
</Grid> 

而且我X​​aml.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace zh1_beteges 
{ 
    /// <summary> 
    /// Interaction logic for PatientData.xaml 
    /// </summary> 
    public partial class PatientData : Window 
    { 
     public PatientVM bvm; 
     public PatientData() 
     { 
      InitializeComponent(); 
      bvm = new PatientVM(DP); 
      this.DataContext = bvm; 
     } 
     public PatientData(Patient b) 
     { 
      InitializeComponent(); 
      bvm = new PatientVM(b,DP); 
      this.DataContext = bvm; 
     } 
    } 
} 

回答

1

是的,你可以使用自定义做到这一点转换器。自定义转换器允许您将数据绑定到转换为或来自该数据的另一个值。在你的情况下,你需要一个转换器,将选定的日期转换为该日期过去的时间。

您应该创建这样一个类:

public class DatetimeToPassedDateConverter : IValueConverter,MarkupExtension 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if(value is DateTime) 
      return DateTime.Now-(DateTime)value; 
     else 
      return null; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Convert back which is not required in your case 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

,然后用它在你的XAML这样的:

<Label Content="{Binding ElementName=DP,Path=SelectedDate,Converter={namespace:DatetimeToPassedDateConverter}}" HorizontalAlignment="Left" VerticalAlignment="Center" 
     FontSize="14" Margin="10,0,10,0" Grid.Row="2" Grid.Column="3"> 
</Label> 

更多有关自定义转换看this article

+0

感谢您的提示。 我创建了一个类并添加了这个标签,但是我得到了一些'没有找到名称空间'。如何将其添加到'XAML'代码中? – agiro

+0

请参阅您的xaml页面的顶部。在最初的部分中,您会看到一些“xmlns:xxx = yyy”。遵循相同的语法,并在那里为你的班级添加命名空间 – Emad

+0

根据你所链接的教程立即尝试。转换后的类位于命名空间内,我的其他所有东西都是公有的,没有运气。 我这样做BTW: ' <地方:DatetimeToPassedDateConverter X:键= “dateConverter”/> ' – agiro

1

您可以创建属性里面PatientVM称为SelectedDate

private DateTime? selectedDate; 
public DateTime? SelectedDate 
{ 
    get 
    { 
     return selectedDate; 
    } 
    set 
    { 
     selectedDate = value; 
     RaisePropertyChanged("SelectedDate"); 
     DateSelectionChangedExecute(); 
    } 
} 

然后在DateSelectionChangedExecute计算Age(此方法例如应当加以改进,以防止负面年龄):

private void DateSelectionChangedExecute() 
{ 
    if (SelectedDate != null && SelectedDate.Value != null) 
     Age = DateTime.Now.Year - SelectedDate.Value.Year; 
} 

和绑定SelectedDate到您的DatePicker xaml:

<DatePicker x:Name="DP" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" 
       VerticalAlignment="Center" DisplayDateStart="2016/01/01" 
       SelectedDate="{Binding SelectedDate}"> 
</DatePicker> 

感谢此次每SelectedDate更改Age将被计算。

+0

感谢您的帮助,但在@Emad的帮助下,我可以让他的解决方案工作。 – agiro