使用Catel在MVVM中创建用户定义的对话框

时间:2013-10-04 12:08:10

标签: c# wpf mvvm catel

我需要创建一个GUI-DLL-Component,它应该用作对话框。 此对话框执行一些计算,然后在数据库中搜索结果(假设结果是一个数字)。

结果通过viewmodel的公共属性绑定到视图。

用户想要实例化此GUI组件的对象并打开对话框,计算完成后,用户需要在稍后的时间点访问该结果。

我想问的是如何在对对象进行实例化后访问viewmodel的(Result)公共属性,因为我不知道如何以MVVM方式进行操作。我的临时解决方案是在后面的代码中转换窗口的数据上下文,然后访问其公共属性。但它不是MVVM(在这种情况下,对话框是从窗口类派生的。在调用方法.showdialog()之后,无法访问窗口viewmodel的公共属性)。

我如何以MVVM方式执行此操作?

非常感谢你的帮助:)。

致以最诚挚的问候,

胡志明

编辑:

这是我的代码:

XAML:

<catel:DataWindow x:Class="WpfApplication3.MainWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:catel="http://catel.codeplex.com" 
                  mc:Ignorable="d" 
                  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                  xmlns:viewmodel="clr-namespace:WpfApplication3.ViewModels"
                  d:DesignHeight="273" 
                  d:DesignWidth="457" 
                  SizeToContent="WidthAndHeight">

    <Window.DataContext>
        <viewmodel:MainWindowViewModel></viewmodel:MainWindowViewModel>
    </Window.DataContext>    

    <Grid>
        <Button Content="Calc 1+1" 
                Height="39" 
                Name="button1" 
                Width="87" 
                Command="{Binding CalcCmd}"/>

        <TextBox Height="23" 
                 HorizontalAlignment="Left" 
                 Name="textBox1" 
                 VerticalAlignment="Top" 
                 Width="87" 
                 Margin="174,152,0,0" 
                 Text="{Binding Result}"/>

        <Label Content="Result:" 
               Height="28" 
               HorizontalAlignment="Left" 
               Margin="111,152,0,0" 
               Name="label1" 
               VerticalAlignment="Top" 
               Width="46" />
    </Grid>        
</catel:DataWindow>

代码背后:

using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Catel.Windows;
using WpfApplication3.ViewModels;

namespace WpfApplication3
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : DataWindow
    {

        public MainWindow()
        {
            InitializeComponent();
        }

        public MainWindow(MainWindowViewModel mainWindowViewModel)
            : base(mainWindowViewModel)
        {
            InitializeComponent();
        }

    //Temporal solution
    public string Result
    {
        get {
            MainWindowViewModel vm = (MainWindowViewModel)this.DataContext;
            return vm.Result;
        }
    }
    }
}

视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Catel.MVVM;
using Catel.Data;

namespace WpfApplication3.ViewModels
{
    /// <summary>
    /// name view model.
    /// </summary>
    public class MainWindowViewModel : ViewModelBase
    {
        #region Fields
        #endregion

        #region Constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="MainWindowViewModel"/> class.
        /// </summary>
        public MainWindowViewModel()
        {
            registeringCommands();
        }
        #endregion

        #region Properties
        /// <summary>
        /// Gets the title of the view model.
        /// </summary>
        /// <value>The title.</value>
        public override string Title { get { return "MyMainWindow"; } }

        /// <summary>
        /// Gets or sets the property value.
        /// </summary>
        public string Result
        {
            get { return GetValue<string>(ResultProperty); }
            set { SetValue(ResultProperty, value); }
        }

        /// <summary>
        /// Register the Result property so it is known in the class.
        /// </summary>
        public static readonly PropertyData ResultProperty = 
            RegisterProperty("Result", typeof(string), null);

        #endregion

        #region Commands
        /// <summary>
        /// Gets the name command.
        /// </summary>
        public Command CalcCmd { get; private set; }

        /// <summary>
        /// Method to invoke when the name command is executed.
        /// </summary>
        private void execute_CalcCmd()
        {
            try {
                Result = (1 + 1).ToString();
            }
            catch(Exception ex)
            {
                throw;
                //log
            }
        }
        #endregion

        #region Methods
        private void registeringCommands()
        {
            CalcCmd = new Command(execute_CalcCmd);
        }
        #endregion
    }
}

1 个答案:

答案 0 :(得分:1)

您可以将视图模型实例传递给UIVisualizerService的ShowDialog方法。窗口关闭后,此视图模型仍然可用,这与DataWindow上使用的视图模型相同。您只需使用调用视图模型中的值即可。

如果结果需要在很多类中使用,最好为此创建一个专用的类/服务,并在ServiceLocator中注册它。例如,您在DataWindow中修改的设置:ISettings,您可以通过查询ServiceLocator / DependencyResolver或在需要信息的类中注入它们来随处读取。