WPF / MVVM:RichTexBox作为数据网格单元格编辑器,将格式代码放入ViewModel?

时间:2010-07-31 18:39:27

标签: wpf mvvm binding richtextbox

我真的很想知道我可以在ViewModel中添加什么。

如果需要测试它可能会有人说......

但是像CaretPosition这样的属性(获取所选文本)不依赖

属性,然后最好忘记ViewModel。

目前我在代码隐藏中有这个:

private void rtbContent_SelectionChanged(object sender, System.Windows.RoutedEventArgs e)
        {
            RichTextBox rtb = sender as RichTextBox;

            TextPointer tpForward = rtb.CaretPosition.GetNextContextPosition(LogicalDirection.Forward);
            TextPointer tpBackward = rtb.CaretPosition.GetNextContextPosition(LogicalDirection.Backward);

            if (tpForward != null && tpBackward != null)
            {
                DependencyObject nextObj = tpForward.GetAdjacentElement(LogicalDirection.Forward);
                DependencyObject prevObj = tpBackward.GetAdjacentElement(LogicalDirection.Backward);

                TextElement textElement = (TextElement)(nextObj ?? prevObj);

                if (textElement != null)
                {
                    tbBold.IsChecked = textElement.FontWeight == FontWeights.Bold;
                    tbItalic.IsChecked = textElement.FontStyle == FontStyles.Italic;
                    //...
                }
            }          
        }

此代码格式化选定文本,当光标位于格式化字符/格式化字符之前切换togglebutton的状态,就像在单词中一样...

1。)这些代码属于哪里?代码隐藏或ViewModel?实际上我知道答案,因为RTBox的技术限制,它将留在代码隐藏。

2.)切换格式按钮的逻辑是通过

完成的

但这不起作用,因为BoldCommand无法执行格式化所选文本的方法,因为RTB的选定文本无法绑定到ViewModel ...

如何应对?

更新

病房铃声说:

“我对代码隐藏中的一些代码持开放态度; ...我在决策逻辑中划清界限。当我看到任何类型的条件语句时,我闻到了一只老鼠。这就是错误繁殖的地方。条件逻辑是代码我们应该进行测试。“

来源:http://codebetter.com/blogs/wardbell/archive/2010/03/19/mvvm-josh-smith-s-way.aspx

1 个答案:

答案 0 :(得分:0)

数据进入模型,UI进入视图,其中包括格式化文本以供显示。现在,请记住View也可以包含代码隐藏 - 它不一定是严格的XAML。