2017-06-09 5 views
0

キャレット位置にRichTextBoxに挿入するテキストをListBoxから選択しました。選択したテキストをテキスト文字列の最後に挿入することができます。wtfツールキットを使用してRichTextBox mvvmのボタンからキャレットにテキストを挿入

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; 
      } 

     } 
    } 

私はフロードキュメントを試しましたが、引き続きパラメータを正しく渡すことができませんでした。

答えて

-1

ビューコードの背後にセットアップされているビューモデルに関数を追加するのが好きです。

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

あなたが最後に、あなたにGetCarrotPosition()関数を呼び出し

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; 
     }; 
     //... 

現在の位置に開始開始文書からのオフセットを取得してテキスト文字列に文字の数を取得することができますように見えます背後にあるビューコードにアップ配線しますビューモデルにデリゲートを作成するコマンド

var carrotPosition = GetCarrotPosition(); 
    TestText.Insert(carrotPosition, selectedItem.Command); 

は、私の知っているUI要素での作業の最もセクシーなMVVM方法です。

+0

これ以外にも、添付のビヘイビアでこれをすべて行うことができ、特定のビューのコードの後ろにビューモデルの半分で終わるのではなく、実際に(再)利用できるものがあります... – Haukinger

関連する問題