Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Catel在MVVM中创建用户定义的对话框_C#_Wpf_Mvvm_Catel - Fatal编程技术网

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

C# 使用Catel在MVVM中创建用户定义的对话框,c#,wpf,mvvm,catel,C#,Wpf,Mvvm,Catel,我需要创建一个GUI DLL组件,它应该用作对话框。 该对话框执行一些计算,然后在数据库中搜索结果(假设结果是一个数字) 结果通过viewmodel的公共属性绑定到视图 用户希望显示此GUI组件的对象并打开对话框,计算完成后,用户需要在稍后的时间点访问结果 我想问的是,在初始化对象之后,如何访问viewmodel的(Result)公共属性,因为我不知道如何以MVVM的方式进行访问。我的临时解决方案是在代码中强制转换窗口的数据上下文,然后访问其公共属性。但它不是MVVM(在本例中,对话框是从win

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

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

用户希望显示此GUI组件的对象并打开对话框,计算完成后,用户需要在稍后的时间点访问结果


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

如何以MVVM的方式实现这一点

非常感谢您的帮助:)

致以最良好的祝愿

编辑:

这是我的密码:

XAML:


代码隐藏:

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;
        }
    }
    }
}
使用System.Text;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用Catel.Windows;
使用WpfApplication3.ViewModels;
命名空间WpfApplication3
{
/// 
///Interaktionslogik für MainWindow.xaml
/// 
公共部分类主窗口:数据窗口
{
公共主窗口()
{
初始化组件();
}
公共主窗口(MainWindowViewModel MainWindowViewModel)
:基本(mainWindowViewModel)
{
初始化组件();
}
//时间解
公共字符串结果
{
得到{
MainWindowViewModel vm=(MainWindowViewModel)this.DataContext;
返回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
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Catel.MVVM;
使用类别数据;
命名空间WpfApplication3.ViewModels
{
/// 
///命名视图模型。
/// 
公共类MainWindowViewModel:ViewModelBase
{
#区域字段
#端区
#区域构造函数
/// 
///初始化类的新实例。
/// 
公共主窗口视图模型()
{
注册命令();
}
#端区
#区域属性
/// 
///获取视图模型的标题。
/// 
///标题。
公共重写字符串标题{get{返回“MyMainWindow”;}
/// 
///获取或设置属性值。
/// 
公共字符串结果
{
获取{返回GetValue(ResultProperty);}
set{SetValue(ResultProperty,value);}
}
/// 
///注册Result属性,使其在类中已知。
/// 
公共静态只读属性Data ResultProperty=
RegisterProperty(“结果”,类型(字符串),null);
#端区
#区域命令
/// 
///获取name命令。
/// 
公共命令CalcCmd{get;private set;}
/// 
///方法在执行name命令时调用。
/// 
私有void execute_CalcCmd()
{
试一试{
结果=(1+1).ToString();
}
捕获(例外情况除外)
{
投掷;
//日志
}
}
#端区
#区域方法
专用无效注册表命令()
{
CalcCmd=新命令(执行CalcCmd);
}
#端区
}
}

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


如果结果需要在许多类中使用,最好为此创建一个专用类/服务,并在ServiceLocator中注册它。例如,a Settings:i您在数据窗口中修改的设置,您可以通过查询ServiceLocator/DependencyResolver或将它们注入到您需要信息的类中来读取这些设置。

到目前为止您做了什么?有什么问题吗?我想问的是,在初始化对象之后,如何访问viewmodel的(结果)公共属性,因为我不知道如何以MVVM的方式进行访问。我的临时解决方案是在代码中强制转换窗口的数据上下文,然后访问其公共属性。但答案不是MVVM.Thx:)。顺便说一下,我读了你关于DataWindow的文章:。在后面的代码中,我得到了一个xaml解析器异常,该异常遵循示例,没有空构造函数。我做错什么了吗?
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
    }
}