1

アセンブリ内に、.NETと非常によく似た変更できないコントロールがありますDateTimePicker。特定の条件(ViewModelのプロパティ値)が満たされたときに、そのコントロールのタイムピッカー部分を非表示にします。コントロールは次のようになります。

[TemplatePart(Name = "PART_DatePicker", Type = typeof (DatePicker))]
[TemplatePart(Name = "PART_TimePicker", Type = typeof (TimePicker))]
public class MyDateTimePicker : Control    {/*...*/}

この回答は、コントロールの一部を常に非表示にするための優れた方法を示していますが、動的に実行したいと思います。

WPFコントロールの一部を非表示にする方法

これを行うにはいくつかの方法があると思います。私が欲しいのは、最小限のもの(リンクされた質問の回答のように)と、MVVMに違反しないものです。 System.Interactivity行動とトリガーは公正なゲームです。

4

3 に答える 3

3

前のコントロールを拡張する新しいコントロールを作成します

public sealed class MySuperiorDateTimePicker : MyDateTimePicker 
{
    //....

ViewModelの状態にバインドできるDependencyPropertyを追加します

public static readonly DependencyProperty HideItProperty =
    DependencyProperty.Register(
        "HideIt",
        typeof(bool),
        typeof(MySuperiorDateTimePicker ),
        new UIPropertyMetadata(false, HideItPropertyChanged));
//snip property impl

プロパティが変更されるのを待ってから、UIを非表示にします

private static void HideItPropertyChanged(DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    (d as MySuperiorDateTimePicker).OnHideItChanged((bool)e.OldValue, 
        (bool)e.NewValue);
}

private void OnHideItChanged(bool oldValue, bool newValue)
{
    if(BusyTemplate == null)
        return;
    FindTimePicker().Visibility = newValue ? Visibility.Visible : 
        Visibility.Collapsed;
}

private UIElement FindTimePicker()
{
    //snip null checks
    return GetTemplateChild("PART_TimePicker") as UIElement;
}

FindTimePickerコントロールがロードされる前にDPが変更され、GetTemplateChildnullが返される可能性があるため、注意してください。通常行うことは、で、 nullを返すOnHideItChanged場合は、後で(またはそれ以前に)イベントハンドラーを再実行するために使用します。GetTemplateChildDispatcher.BeginInvokeApplicationIdle

「MVVMを使用してUI作業を行うにはどうすればよいですか」と言ったら、やめて本当の目標を考え直してください。MVVM!=コードビハインドなし、カスタムコントロールなしなど。

于 2013-01-24T19:48:46.813 に答える
0

私のために働いた解決策は、コントロールのスタイルを編集することでした。Blendを使用して、DateTimePickerのスタイルのコピーを編集し、VMを調べて列挙の値を変換するVisibility oftheTimePickerにバインディングを追加しました。

于 2013-01-24T20:43:37.257 に答える
0

1つの解決策は、データテンプレートで定義されたDataTriggerを使用して非表示にすることです。これにより、コントロールのデータコンテキストの特定の値がtrue / falseに設定されたときに、パーツを非表示/表示します。

簡単に検索すると、役立つと思われるリンクがいくつか見つかりました: http: //zamjad.wordpress.com/2010/06/22/conditionally-hide-controls-from-data-template/ http://social.msdn。 microsoft.com/Forums/en-US/wpf/thread/ae2dbfb7-5dd6-4352-bfa1-53634289329d/

于 2013-01-24T18:44:14.067 に答える