2010-03-30 37 views
7

Trong WinForms chúng ta có thể chỉ định DialogResult cho các nút. Trong WPF chúng ta có thể khai báo trong XAML chỉ Hủy bỏ nút:WPF DialogResult tuyên bố?

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

Đối với những người khác chúng ta cần phải bắt ButtonClick và viết mã như thế:

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

Tôi đang sử dụng MVVM, vì vậy tôi chỉ có mã XAML cho các cửa sổ. Nhưng đối với các cửa sổ phương thức, tôi cần phải viết mã như vậy và tôi không thích điều này. Có cách nào thanh lịch hơn để làm những điều như vậy trong WPF?

+0

trùng lặp: http://stackoverflow.com/questions/ 501886/wpf-mvvm-newbie-how-should-the-viewmodel-close-the-form –

+0

Tôi đã từng cảm thấy cách này bằng cách sử dụng mã phía sau với MVVM nhưng thành thật mà nói, tôi nghĩ rằng thiết lập một lá cờ duy nhất trong mã phía sau * là * giải pháp thanh lịch nhất. Tại sao chiến đấu với nó. Không có điểm viết một hành vi phức tạp kèm theo cho rất ít được. – craftworkgames

Trả lời

2

Bạn có thể thực hiện việc này với attached behavior để giữ cho MVVM của bạn luôn sạch sẽ. C# mã cho hành vi gắn liền của bạn có thể trông giống như sau:

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

Bạn có thể sử dụng thuộc tính trong XAML với mã dưới đây:

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

Tôi không biết tại sao anh ấy không đánh dấu câu trả lời của bạn, nhưng tôi đang bỏ phiếu cho nút chấp nhận phong cách MVVM hữu ích. Các hành vi tương tác có thể làm điều này, nhưng điều đó quá chi tiết đối với tôi vì một điều đơn giản như vậy. – Alan