Читайте также:
|
|
Развивая идею 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Реализация ChildViewModelBase | | | Создание проектов |