注:私はこれに費やす余分な時間がたくさんあったしない限り、この場合、私はない - 完全 - MVVMフレンドリーにそれをチョークう第三者コントロール、 "ルール"を少し破って、あなたのViewクラスにいくつかのコードを入れて、そのテキストエディタへの参照をモデルに渡します。
"純粋な非コードビハインドMVVM"に行きたい場合は、XamTextEditorとの通信方法を知っていて、基になるビューモデルからイベントを受け取る何らかの種類のプロキシオブジェクトを作成する必要があります。これは、Blend/Prismがユーザー対話ダイアログを実行するために使用するメカニズムに似ています。「アクション」オブジェクトは、ビューモデル(単に対話要求イベントを発生させる)とページ上の他のUI要素との間の橋渡しをします。
これは、現在の選択位置でXamTextEditorに文字列を挿入する方法を知っているオブジェクトを作成することが最も堅牢な方法だと思います。
<local:XamEditorInserter
SourceObject="{Binding InsertTagRequest}"
TargetEditor="{Binding ElementName=TBody}" />
この手法は、いくつかの方法で実装できます。最も簡単なのは、カスタム "ブリッジ"オブジェクトが加入できるイベントを持つインターフェースを定義することです。 (TriggerBase
ブレンドからSDKを効果的に同じことが、実装するために、もう少しコードである、実際のList<Action>
を公開します):
public class CustomTriggerEventArgs : EventArgs
{
public string StringData
{
get;
set;
}
}
public interface ICustomTrigger
{
event EventHandler<CustomTriggerEventArgs> CustomTriggerRaised;
}
public class CustomTrigger : ICustomTrigger
{
event EventHandler<CustomTriggerEventArgs> CustomTriggerRaised;
public void Raise(string s)
{
if (this.CustomTriggerRaised != null)
{
this.CustomTriggerRaised(this, new CustomTriggerEventArgs { StringData = s });
}
}
}
あなたのブリッジオブジェクトは、その後SourceObject
が変更されたとき、そのイベントにフックする必要があります:あなたのviewmodelで
public DependencyObject SourceObject
{
get
{
return this.GetValue(SourceObjectProperty) as DependencyObject;
}
set
{
if (value is ICustomTrigger)
{
((ICustomTrigger)value).CustomTriggerRaised += this.TriggerRaised;
}
this.SetValue(SourceObjectProperty, value);
}
}
public void TriggerRaised(object sender, CustomTriggerEventArgs e)
{
if (this.TargetEditor != null)
{
var sel = this.TargetObject.SelectionStart;
var tag = e.StringData;
// do whatever.
}
}
、あなただけの、タイプICustomTrigger
のプロパティを定義new CustomTrigger()
にそれを設定し、あなたのテキストエディタに新しいタグを挿入する必要があるときにそのRaise()
メソッドを呼び出します。