1

DateTimeのペアを含むビューモデルがありますか?オブジェクト-null許容のDateTimes。

private DateTime? _xmitdtFrom;
public DateTime? xmitdtFrom
{
    get { return this._xmitdtFrom; }
    set
    {
        this._xmitdtFrom = value;
        notifyPropertyChanged("xmitdtFrom");
    }
}

private DateTime? _xmitdtTo;
public DateTime? xmitdtTo
{
    get { return this._xmitdtTo; }
    set
    {
        this._xmitdtTo = value;
        notifyPropertyChanged("xmitdtTo");
    }
}

xmitdtFromの日付をxmitdtFromの日付より大きくすることはできません。また、xmitdtToの日付をxmitdtFromの日付より前にすることはできません。また、xmitdtToの日付とxmitdtFromの日付を今日より後にすることもできません。

だから、マークアップで私はこれを持っています:

<Label Grid.Row="1" Grid.Column="1">
    From:
</Label>
<DatePicker Grid.Row="1" Grid.Column="2" 
        SelectedDate="{Binding xmitdtFrom, Mode=TwoWay}"
        DisplayDateEnd="{Binding xmitdtTo}"
        />
<Label Grid.Row="2" Grid.Column="1">
    Through:
</Label>
<DatePicker Grid.Row="2" Grid.Column="2"
        SelectedDate="{Binding xmitdtTo, Mode=TwoWay}"
        DisplayDateStart="{Binding xmitdtFrom}"
        DisplayDateEnd="{x:Static sys:DateTime.Now}"
        />

そして、xmitdtToがnullでない限り、これは正常に機能します。nullの場合、xmitdtFromは制限されません。これは、問題です。

xmitdtFromのDisplayDateEndをnullでない場合はxmitdtToに設定し、nullでない場合はDateTime.Nowに設定します。

そして、私はこれを達成するための最もクリーンな方法は何でしょうか。

4

3 に答える 3

1

私は完全に別のアプローチで行くことにしました。

ビューモデルをいじる代わりに、IfNullConverterを作成しました。これは、バインディングで使用すると、nullでない場合はバインドされたオブジェクトを渡し、nullの場合はConversionParameterを渡します。

そして、from日付のDisplayDateEndをバインドする際にそれを使用しました-バインドされたプロパティとしてxmitDTToを使用し、ConversionParameterとしてDateTime.Nowを使用しました。

完全にUI内で問題をきれいに解決します(これはUIの問題であり、データの問題ではないため、ビューモデルを汚染しない解決策をお勧めします)。また、他の同様の状況で使用できる汎用機能を作成します。

コンバーター:

public class IfNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return parameter;
        else
            return value;
    }

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

バインディング:

<DatePicker Grid.Row="1" Grid.Column="2" 
    SelectedDate="{Binding Path=xmitdtFrom, Mode=TwoWay}"
    DisplayDateEnd="{Binding xmitdtThrough, Converter={StaticResource ifNullConverter}, ConverterParameter={x:Static sys:DateTime.Now}}"
    />
于 2012-10-06T12:46:54.477 に答える
0

xmitdtToをnullにする必要があることはありますか?つまり、nullの場合、重要なデータを取得または保存していませんよね?その場合は、_xmitdtToをデフォルトとしてtodayに設定することで、問題全体を回避できます。

private DateTime? _xmitdtTo = DateTime.Today; 

データを保持する必要がある場合は、代わりにプロパティを変更して、_xmitdtToがnullのときに今日を返すようにすることができます。

public DateTime? xmitdtTo   
{   
    get
    {
        if (!_xmitdtTo.HasValue)
            return DateTime.Today;
        return this._xmitdtTo; 
    }  

データのnullを本当に保持したい場合は、オブジェクトに個別のプロパティを作成して、xmitdtToのDisplayDateEndに割り当てることができます。

public DateTime xmitdtDateEnd
{
    get
    {
        return _xmitdtTo ?? DateTime.Today;
    }
}

xmitdtToプロパティの割り当てにnotifyPropertyChanged( "xmitdtDateEnd")の呼び出しを追加することを忘れないでください。これにより、xmitdtToを変更したときにUIが更新されます。

set 
{ 
    this._xmitdtTo = value; 
    notifyPropertyChanged("xmitdtTo"); 
    notifyPropertyChanged("xmitdtDateEnd"); 
} 
于 2012-10-05T18:58:49.880 に答える
0

たぶん、DisplayDateEndでバインドできる別のプロパティを追加してみることができます。このようなもの(テストされていない):

    private DateTime? _displayDateEnd;
    public DateTime? DisplayDateEnd
    {
        get { return this._displayDateEnd; }
        set
        {
            this._displayDateEnd = value; 
            notifyPropertyChanged("DisplayDateEnd");
        }

xmidtToから新しいプロパティの値を設定します。

    private DateTime? _xmitdtTo; 
    public DateTime? xmitdtTo 
    { 
        get { return this._xmitdtTo; }
        set 
        { 
            this._xmitdtTo = value;

            if (_xmitdtTo == null)
                DisplayDateEnd = _xmitdtTo;
            else
                DisplayDateEnd = DateTime.Now();

            notifyPropertyChanged("DisplayDateEnd"); 
            notifyPropertyChanged("xmitdtTo"); 
        } 
    }

更新されたxaml:

<DatePicker ... DisplayDateEnd="{Binding DisplayDateEnd}"/>
于 2012-10-05T18:43:09.893 に答える