使用wpf工具包从RichTextBox mvvm中的按钮在插入符号处插入文本

时间:2017-06-09 04:52:27

标签: mvvm prism richtextbox wpftoolkit

我从ListBox中选择了要插入到插入位置的RichTextBox中的文本。我可以将所选文本插入文本字符串的末尾。

我不确定如何将RichTextBox插入位置传递给我的视图模型。

这是我项目代码的一部分。

            <Button x:Name="AddItemBtn" Content="Add Item" HorizontalAlignment="Left" Margin="417,10,0,0" VerticalAlignment="Top" Width="100" Command="{Binding AddItemBtn}" CommandParameter="{Binding ElementName=AddItemList,Path=SelectedItem}"/>
        <wpftoolkit:RichTextBox  Grid.Column="0" Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" x:Name="MyEditor" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="0" Height="Auto" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Width="Auto" IsDocumentEnabled="True" AcceptsTab="True" AcceptsReturn="True" >
            <wpftoolkit:RichTextBox.Resources>
                <Style TargetType="{x:Type Paragraph}">
                    <Setter Property="Margin" Value="0" ></Setter>
                    <Setter Property="FontSize" Value="15"></Setter>
                </Style>
            </wpftoolkit:RichTextBox.Resources>
            <wpftoolkit:RichTextBox.TextFormatter>
                <wpftoolkit:PlainTextFormatter/>
            </wpftoolkit:RichTextBox.TextFormatter>
        </wpftoolkit:RichTextBox>

这是视图模型部分。

        private string _testText;
    public string TestText
    {
        get
        {
            return _testText;
        }

        set
        {
            //_testText = _testText + value;
            SetProperty(ref _testText, value);
        }

    }

    public ICommand AddItemBtn
    {
        get;
        set;
    }

    public void addItem(Tabbed selectedItem)
    {
        if (selectedItem != null)
        {
            MessageBox.Show(selectedItem.Command);
            if (TestText != null)
            {
                TestText = TestText.ToString() + selectedItem.Command;
            }
            else
            {
                TestText =  selectedItem.Command;
            }

        }
    }

我尝试了一个flowdocument,但仍无法正确传递参数。

1 个答案:

答案 0 :(得分:-1)

我喜欢在后面的视图代码中设置的视图模型上放置一个函数。

public class MainViewModel : ViewModelBase
{
    public Func<int> GetCarrotPosition { get; set; }
    //...

看起来您可以通过获取从文档开始到当前位置的偏移量来获取文本字符串中的字符数

    public MainWindow()
    {
        // InitializeComponent stuff..
        var castedContext = (MainViewModel)DataContext;
        castedContext.GetCarrotPosition = () =>
        {
            // Placing the cursor at the start of the text returns a value of 2, so I subtract 2 to get the current cursor location
            return MyRichTextBox.CaretPosition.DocumentStart.GetOffsetToPosition(MyRichTextBox.CaretPosition) - 2; 
        };
        //...

最后,在命令

中调用GetCarrotPosition()函数
    var carrotPosition = GetCarrotPosition();
    TestText.Insert(carrotPosition, selectedItem.Command);

在后面的视图代码中连接的视图模型上创建委托是使用我知道的UI元素的最性感的MVVM方式。