WPF DialogResult декларативно? - PullRequest
7 голосов
/ 30 марта 2010

В WinForms мы могли указать DialogResult для кнопок. В WPF мы можем объявить только в XAML кнопку Отмена:

<Button Content="Cancel" IsCancel="True" />

Для других нам нужно перехватить ButtonClick и написать такой код:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

Я использую MVVM, поэтому у меня есть только код XAML для Windows. Но для модальных окон мне нужно написать такой код, и мне это не нравится. Есть ли более элегантный способ делать такие вещи в WPF?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Вы можете сделать это с прикрепленным поведением , чтобы сохранить MVVM в чистоте. Код C # для вашего прикрепленного поведения может выглядеть примерно так:

public static class DialogBehaviors
{
    private static void OnClick(object sender, RoutedEventArgs e)
    {
        var button = (Button)sender;

        var parent = VisualTreeHelper.GetParent(button);
        while (parent != null && !(parent is Window))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }

        if (parent != null)
        {
            ((Window)parent).DialogResult = true;
        }
    }

    private static void IsAcceptChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var button = (Button)obj;
        var enabled = (bool)e.NewValue;

        if (button != null)
        {
            if (enabled)
            {
                button.Click += OnClick;
            }
            else
            {
                button.Click -= OnClick;
            }
        }
    }

    public static readonly DependencyProperty IsAcceptProperty =
        DependencyProperty.RegisterAttached(
            name: "IsAccept",
            propertyType: typeof(bool),
            ownerType: typeof(Button),
            defaultMetadata: new UIPropertyMetadata(
                defaultValue: false,
                propertyChangedCallback: IsAcceptChanged));

    public static bool GetIsAccept(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsAcceptProperty);
    }

    public static void SetIsAccept(DependencyObject obj, bool value)
    {
        obj.SetValue(IsAcceptProperty, value);
    }
}

Вы можете использовать свойство в XAML с кодом ниже:

<Button local:IsAccept="True">OK</Button>
1 голос
/ 30 марта 2010

Альтернативным способом является использование Popup Control

Попробуйте этот учебник .

...