2010-03-30 8 views
7

In WinForms è possibile specificare DialogResult per i pulsanti. In WPF possiamo dichiarare in XAML solo pulsante Annulla:WPF DialogResult in modo dichiarativo?

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

Per gli altri abbiamo bisogno di catturare ButtonClick e scrivere il codice del genere:

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

Sto usando MVVM, quindi ho solo il codice XAML per finestre. Ma per Windows modale ho bisogno di scrivere questo codice e non mi piace. C'è un modo più elegante per fare queste cose in WPF?

+0

Duplicate: http://stackoverflow.com/questions/ 501886/wpf-mvvm-newbie-how-should-the-viewmodel-close-the-form –

+0

Mi sentivo in questo modo sull'uso del codice con MVVM, ma a dire il vero credo che impostare un singolo flag nel codice dietro * sia * la soluzione più elegante. Perché combatterlo Non ha senso scrivere un comportamento complesso attaccato per un guadagno molto piccolo. – craftworkgames

risposta

2

È possibile eseguire questa operazione con un attached behavior per mantenere pulito MVVM. Il codice C# per il vostro comportamento allegato potrebbe essere qualcosa in questo modo:

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); 
    } 
} 

È possibile utilizzare la proprietà in XAML con il codice qui sotto:

<Button local:IsAccept="True">OK</Button> 
+0

Non so perché non ha contrassegnato la tua risposta, ma sto votando per l'utile pulsante di accettazione stile MVVM. I comportamenti di interazione potrebbero farlo, ma è troppo verboso per me per qualcosa di così semplice. – Alan

Problemi correlati