跨ViewModels共享属性值(WPF MVVM)

时间:2014-05-07 08:39:31

标签: c# mvvm hyperlink

我正在使用MVVM模式并尝试继续使用view-viewModel 1-1关系。我有一个带RichTextBox的窗口,我正在编写用户通过从“添加超链接”功能区按钮触发对话框窗口来添加超链接的能力。

通过将属性传递给构造函数,我将属性放入超链接对话框窗口,这样可以正常工作,但是我在将附加值发送回父ViewModel时遇到了问题。

这是从我的主页面ViewModel代码中保存RTB文本的属性:

    private viewArticle _ModelviewArticle = new viewArticle();
    public viewArticle ModelviewArticle
    {
        get { return _ModelviewArticle; }
        set
        {
            OnPropertyChanged("ModelviewArticle");
        }
     }

此属性包含绑定到RichTextBox的文本。然后,我通过按钮单击命令显示超链接窗口,并附加用户选择的超链接&链接自己ViewModel中文本框输入的文本(这仍未完成):

 public static string BuildRtfHyperlink(string Url, string Linktext)
    {
        if (Url != null && Linktext != null)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendFormat(@"{0}{{\ul\\cf3\ltrch {{\field{{\*\fldinst {{ HYPERLINK ""{1}""}}}}{{\fldrslt {{{2}}}}}}}}}\li0\\ri0\sa0\sb0\fi0\ql\par}}", _ArticleBody, Url, Linktext);

            return sb.ToString();               
        }
        else
        {
            MessageBox.Show("Please enter valid linked text and URL");
            return ""; 
        }              
    }

有没有办法将返回的字符串附加到另一个_ModelviewArticle中的ViewModel属性中,或者我最好使用一个ViewModel作为主页面和超链接页面视图,因为它们共享功能?

由于

1 个答案:

答案 0 :(得分:0)

如果从主视图(带有富文本框的窗口)弹出附加对话框,则可以获取返回值(如果有),根据需要进行装饰(即添加适当的富文本格式)然后插入它直接进入富文本框。由于绑定,绑定属性ModelviewArticle应自动更新。

为什么要让视图对此负责?

因为它是对视图本身的操作导致需要弹出对话框。视图模型与视图无关,它不知道那里有什么,因此你不应该使用像这样的小视图特定功能来污染它。

这是否意味着您必须在视图中使用一些代码?

是的,您必须为背后的代码提供少量代码,但此没有任何问题。它是与视图相关的代码,这是它所属的地方。根据你学习WPF的地方,你可能已经看到提到你不应该在视图中隐藏代码 - 这是无稽之谈。如果你能做到那么好,但实际上它经常是必要的。把它放在它所属的地方。

拥有一个微型弹出窗口的视图模型可能有点过分。

是的,你可以拥有它,但实际情况是它只是简单地增加了一个非常简单的弹出窗口的复杂性。对话框服务有许多代码示例,这些代码示例通常涉及视图模型,因为它们处理的是更复杂的弹出视图,这些视图需要多于几个文本。没有理由说你的超链接视图不能成为一个简单的视图,后面有一些代码,因为它的任务非常有限。