0

このプロパティを依存関係プロパティに変換するにはどうすればよいですか?それに関して、誰もが「依存関係プロパティでロジックを使用しないでください」と言って、そのための救済策を提案しませんでした:

    public DateTime? SelectedDateGeorgian
    {
        get
        {
           //choose a control based on this "user control" current mode 
           //and return its value
        }


        set
        {
           //choose a control based on this "user control" current mode 
           // and set its property after some manipulations on the value 
        }
    }

私はそれをこれに変換したい:

    public static readonly DependencyProperty SelectedDateGeorgianProperty =
    DependencyProperty.Register("SelectedDateGeorgian", typeof(DateTime?), typeof(MyDatePicker), new PropertyMetadata(default(DateTime?)));

    public DateTime? SelectedDateGeorgian
    {
        get
        {
            //Its prohobited to do something here ! So what should I do ?
            //How should I select a control and return its value here ?
            //I can't have a simple backing variable because I should do some conversion here                 

            return (DateTime?)GetValue(SelectedDateGeorgianProperty);
        }
        set
        {
             //I want to convert received value here and 
             // and after that update some UI properties in this user control

            SetValue(SelectedDateMiladiProperty, value);
        }
    }

この依存関係プロパティに書き込まれる値を変換し、UIElementsも更新したいと思います。

また、UIElementから値を変換し、読み取られるたびに変換された値を返したいと思います。

だから、私は単純なバッキング変数を持つことができないことがわかります。

誰かがこれを実装するためのパターンを教えてください。

ご清聴ありがとうございました。

4

1 に答える 1

2

はい、できます。

UIElement propertyこれにバインドしてDependencyProperty、を使用する必要がありConverterます。方法:バインドされたデータを変換するを参照してください。

ところで:ここで、DependencyPropertiesがプロパティラッパーに追加のロジックを含めるべきではない理由を見つけることができます。

編集:

<DatePicker Name="dp1"
            SelectedDate="{Binding Path=SelectedDateGeorgian,
                                   RelativeSource="{RelativeSource AncestorType=UserControl}"}" />
<DatePicker Name="dp2"
            SelectedDate="{Binding Path=SelectedDateGeorgian,
                                   RelativeSource="{RelativeSource AncestorType=UserControl}",
                                   Converter={StaticResource dateConverter}}" />

コンバーターを作成します。

[ValueConversion(typeof(DateTime?), typeof(DateTime?))]
public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // your conversions
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // your backconversions
    }
}

そしてそれをリソースとして追加します:

<src:DateConverter x:Key="dateConverter"/>
于 2012-04-18T09:05:44.207 に答える