Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Реализация MessageViewModel

Читайте также:
  1. Возврат и реализация грузов перевозчиком
  2. Выбор и реализация решения
  3. ВЫБЫТИЕ (РЕАЛИЗАЦИЯ, ПЕРЕДАЧА, СПИСАНИЕ) ОСНОВНЫХ СРЕДСТВ
  4. Глава 2. ПРАВА ПОДОЗРЕВАЕМОГО И ИХ РЕАЛИЗАЦИЯ 1 страница
  5. Глава 2. ПРАВА ПОДОЗРЕВАЕМОГО И ИХ РЕАЛИЗАЦИЯ 2 страница
  6. Глава 2. ПРАВА ПОДОЗРЕВАЕМОГО И ИХ РЕАЛИЗАЦИЯ 3 страница
  7. Глава 2. ПРАВА ПОДОЗРЕВАЕМОГО И ИХ РЕАЛИЗАЦИЯ 4 страница

Развивая идею ModalChildViewModelBase, целесообразно реализовать одну из наиболее часто используемых моделей представления – модель представления сообщения MessageViewModel.

Данная модель представления отображает окно с сообщением, заданное набором параметров: тип сообщения (информационное, предупреждение, ошибка), доступные для нажатия кнопки (ОK, ОК/Отмена, Повторить/Отмена, или любой заданный пользователем набор), заголовок окна, и непосредственно само сообщение.

Команда ButtonCommand является здесь универсальной для любой заданной пользователем кнопки: в качестве аргумента ей передается индекс кнопки, который затем записывается в MessageResult; также при этом устанавливается свойство ModalResult, что приводит к закрытию окна.

1: /// <summary>

2: /// View model of modal message

3: /// </summary>

4: [Export(typeof(MessageViewModel))]

5: [PartCreationPolicy(CreationPolicy.NonShared)]

6: [ExportMetadata(AopExtensions.AspectMetadata,

7: Aspects.NotifyPropertyChanged)]

8: public class MessageViewModel: ModalChildViewModelBase

9: {

10: /// <summary>

11: /// Initializes a new instance

12: /// </summary>

13: protected MessageViewModel()

14: {

15: //

16: }

17:

18: // Predefined button sets

19: public static readonly IList<string> OkButtons

20: = new[] { "OК" };

21: public static readonly IList<string> OkCancelButtons

22: = new[] { "OК", "Отмена" };

23: public static readonly IList<string> RetryCancelButtons

24: = new[] { "Повторить", "Отмена" };

25:

26: // Private fields

27: private IList<string> _buttons = OkButtons;

28:

29: /// <summary>

30: /// List of available buttons

31: /// </summary>

32: public virtual IList<string> Buttons

33: {

34: get { return _buttons; }

35: set { _buttons = value; }

36: }

37:

38: /// <summary>

39: /// Message execution result

40: /// </summary>

41: public virtual int MessageResult { get; protected set; }

42:

43: /// <summary>

44: /// Body of the message

45: /// </summary>

46:

47: public virtual string Message { get; set; }

48:

49: /// <summary>

50: /// Type of the message

51: /// </summary>

52: public virtual MessageType MessageType { get; set; }

53:

54: /// <summary>

55: /// Message's caption

56: /// </summary>

57: [Localizable(true)]

58: public virtual string Caption { get; set; }

59:

60: /// <summary>

61: /// View model's title

62: /// </summary>

63: public override string Title

64: {

65: get { return Caption; }

66: }

67:

68: #region Commands

69:

70: private ICommand _buttonCommand;

71:

72: public ICommand ButtonCommand

73: {

74: get

75: {

76: return _buttonCommand??

77: (_buttonCommand = new ActionCommand(

78: param => SetMessageResult(param.ToString())));

79: }

80: }

81:

82: #endregion

83:

84: /// <summary>

85: /// Processes View Model closing attempt

86: /// </summary>

87: protected override void OnClosing(CancelEventArgs e)

88: {

89: base.OnClosing(e);

90: e.Cancel = ModalResult == null;

91: }

92:

93: /// <summary>

94: /// Sets specified button's index as message result

95: /// </summary>

96: private void SetMessageResult(string selectedButton)

97: {

98: if (IsClosed)

99: {

100: return;

101: }

102:

103: Debug.Assert(Buttons.Contains(selectedButton));

104: MessageResult = Buttons.IndexOf(selectedButton);

105: ModalResult = true;

106: }

107: }

Как видно из кода, особенностью представленной модели представления является то, что переопределяемый метод OnClosing не позволяет закрыть окно, не установив MessageResult – таким образом вызывающему коду гарантируется детерминированный результат отображения сообщения.

Соответствующее представление в соответствии с шаблоном MVVM не содержит сложной логики и лишь визуализирует состояние, представленное в модели представления:

1: <UserControl x:Class="TestProject.MessageView"

2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

4: xmlns:controlsHelpers

5: ="clr-namespace:PassportOffice.View.Controls">

6:

7: <Grid>

8: <Grid.Resources>

9: <controlsHelpers:CommandReference

10: x:Key="ButtonCommandReference"

11: Command="{Binding ButtonCommand}" />

12: <controlsHelpers:MessageTypeConverter

13: x:Key="MessageTypeConverter" />

14: </Grid.Resources>

15:

16: <Grid.ColumnDefinitions>

17: <ColumnDefinition Width="Auto" />

18: <ColumnDefinition Width="Auto" />

19: </Grid.ColumnDefinitions>

20: <Grid.RowDefinitions>

21: <RowDefinition Height="*" />

22: <RowDefinition Height="Auto" />

23: </Grid.RowDefinitions>

24:

25: <Image x:Name="ImageMessage" Height="48"

26: UriSource="{Binding MessageType,

27: Converter={StaticResource MessageTypeConverter}}"

28: Grid.Column="0" Grid.Row="0" />

29:

30: <TextBlock Margin="3" MinWidth="300" MaxWidth="600"

31: Text="{Binding Message}" VerticalAlignment="Center"

32: TextWrapping="Wrap" Grid.Column="1" Grid.Row="0" />

33:

34: <ItemsControl x:Name="ButtonsControl"

35: HorizontalAlignment="Center"

36: ItemsSource="{Binding Buttons}" Margin="0,5,0,0"

37: Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1">

38: <ItemsControl.ItemsPanel>

39: <ItemsPanelTemplate>

40: <StackPanel Orientation="Horizontal" />

41: </ItemsPanelTemplate>

42: </ItemsControl.ItemsPanel>

43: <ItemsControl.ItemTemplate>

44: <DataTemplate>

45: <Button Content="{Binding}"

46: Command="{StaticResource ButtonCommandReference}"

47: CommandParameter="{Binding}" />

48: </DataTemplate>

49: </ItemsControl.ItemTemplate>

50: </ItemsControl>

51: </Grid>

52: </UserControl>

 


Дата добавления: 2015-08-13; просмотров: 46 | Нарушение авторских прав


Читайте в этой же книге: Краткие итоги | Задача 3. | Принцип инверсии зависимостей | Формы инверсии зависимостей | IoC контейнер | Сопоставление модели представления и представления | Реализация INotifyPropertyChanged средствами аспектно-ориентированного программирования | Краткие итоги | Понятие IChildViewModelManager | ChildViewManager |
<== предыдущая страница | следующая страница ==>
Реализация ChildViewModelBase| Создание проектов

mybiblioteka.su - 2015-2024 год. (0.011 сек.)