MessageDialogViewModel.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using CommunityToolkit.Mvvm.Input;
  3. using System.Collections.ObjectModel;
  4. namespace InABox.Avalonia.Dialogs;
  5. public partial class MessageDialogViewModel : BasePopupViewModel<MessageDialogResult>
  6. {
  7. [ObservableProperty]
  8. private string _message;
  9. public ObservableCollection<MessageDialogButton> Buttons { get; private set; } = new();
  10. public IEnumerable<MessageDialogButton> LeftButtons => Buttons.Where(x => x.Position == MessageDialogButtonPosition.Left);
  11. public IEnumerable<MessageDialogButton> RightButtons => Buttons.Where(x => x.Position == MessageDialogButtonPosition.Right);
  12. public MessageDialogViewModel()
  13. {
  14. Message = "";
  15. }
  16. [RelayCommand]
  17. private void ButtonClick(MessageDialogButton button)
  18. {
  19. button.Action(this, button);
  20. }
  21. public MessageDialogViewModel AddButton(MessageDialogButton button)
  22. {
  23. Buttons.Add(button);
  24. return this;
  25. }
  26. public MessageDialogViewModel AddOkButton(string content = "OK")
  27. {
  28. Buttons.Add(new MessageDialogButton(content, OKButton_Click, MessageDialogButtonPosition.Right));
  29. return this;
  30. }
  31. public MessageDialogViewModel AddCancelButton(string content = "Cancel")
  32. {
  33. Buttons.Add(new MessageDialogButton(content, CancelButton_Click, MessageDialogButtonPosition.Right));
  34. return this;
  35. }
  36. public MessageDialogViewModel AddYesButton(string content = "Yes")
  37. {
  38. Buttons.Add(new MessageDialogButton(content, YesButton_Click, MessageDialogButtonPosition.Right));
  39. return this;
  40. }
  41. public MessageDialogViewModel AddNoButton(string content = "No")
  42. {
  43. Buttons.Add(new MessageDialogButton(content, NoButton_Click, MessageDialogButtonPosition.Right));
  44. return this;
  45. }
  46. private void YesButton_Click(MessageDialogViewModel window, MessageDialogButton button)
  47. {
  48. window.Close(MessageDialogResult.Yes);
  49. }
  50. private void NoButton_Click(MessageDialogViewModel window, MessageDialogButton button)
  51. {
  52. window.Close(MessageDialogResult.No);
  53. }
  54. private void CancelButton_Click(MessageDialogViewModel window, MessageDialogButton button)
  55. {
  56. window.Close(MessageDialogResult.Cancel);
  57. }
  58. private void OKButton_Click(MessageDialogViewModel window, MessageDialogButton button)
  59. {
  60. window.Close(MessageDialogResult.OK);
  61. }
  62. #region Static Constructors
  63. public static MessageDialogViewModel New()
  64. {
  65. return new MessageDialogViewModel();
  66. }
  67. public static MessageDialogViewModel NewMessage(string message)
  68. {
  69. return new MessageDialogViewModel()
  70. .Message(message)
  71. .AddOkButton();
  72. }
  73. public static async Task ShowMessage(string message)
  74. {
  75. await NewMessage(message).Display();
  76. }
  77. public static MessageDialogViewModel NewOkCancel(string message)
  78. {
  79. return new MessageDialogViewModel()
  80. .Message(message)
  81. .AddOkButton()
  82. .AddCancelButton();
  83. }
  84. public static async Task<bool> ShowOkCancel(string message)
  85. {
  86. return await NewOkCancel(message).Display() == MessageDialogResult.OK;
  87. }
  88. public static MessageDialogViewModel NewYesNo(string message)
  89. {
  90. return new MessageDialogViewModel()
  91. .Message(message)
  92. .AddYesButton()
  93. .AddNoButton();
  94. }
  95. public static async Task<bool> ShowYesNo(string message)
  96. {
  97. return await NewYesNo(message)
  98. .Display() == MessageDialogResult.Yes;
  99. }
  100. public static MessageDialogViewModel NewYesNoCancel(string message)
  101. {
  102. return new MessageDialogViewModel()
  103. .Message(message)
  104. .AddYesButton()
  105. .AddNoButton()
  106. .AddCancelButton();
  107. }
  108. public static async Task<MessageDialogResult> ShowYesNoCancel(string message)
  109. {
  110. return await NewYesNoCancel(message).Display();
  111. }
  112. #endregion
  113. }
  114. public partial class MessageDialogButton : ObservableObject
  115. {
  116. public delegate void MessageDialogButtonDelegate(MessageDialogViewModel window, MessageDialogButton button);
  117. public MessageDialogButtonPosition Position { get; set; }
  118. [ObservableProperty]
  119. private string _content;
  120. public MessageDialogButtonDelegate Action { get; set; }
  121. public MessageDialogButton(string content, MessageDialogButtonDelegate action, MessageDialogButtonPosition position)
  122. {
  123. Content = content;
  124. Action = action;
  125. Position = position;
  126. }
  127. }
  128. public static class MessageDialogBuilder
  129. {
  130. public static MessageDialogViewModel Message(this MessageDialogViewModel window, string message)
  131. {
  132. window.Message = message;
  133. return window;
  134. }
  135. public static async Task<MessageDialogResult> Display(this MessageDialogViewModel window)
  136. {
  137. return await Navigation.Popup<MessageDialogViewModel, MessageDialogResult>(window, false);
  138. }
  139. }