2012-04-27 1 views
0

MVVMを使用して構築されたWPFアプリケーションがあります。コントロールには、タグを挿入する必要があるテキストボックスがあります。私が使用しているコントロールはXamTです。MVVMを使用してVM内でコントロールの非依存プロパティの値を取得する

したがって、ユーザーが挿入ボタンを押すと、フォーカスされたコントロールのSelectionStart値を照会する必要があります。そのため、プロパティーテキストのインデックスにタグを挿入できます。

選択開始プロパティはDPではないため、値をバインドして変更通知を受け取ることはできません。

誰かがMVVMでこれをどのように行うのだろうか?

コントロールは次のように定義されます

<x:XamTextEditor Grid.Column="1" Grid.Row="3" 
       Grid.ColumnSpan="2" Margin="0 5 0 5" 
       Template="{StaticResource ResourceKey=MyTextEditorTemplate}" 
       Name="TBody" 
       Text="{Binding Body}" 
       TextWrapping="Wrap" 
       IsAlwaysInEditMode="{Binding InEditMode,Mode=OneWay}" 
       AcceptsReturn="True" AcceptsTab="True"> 
    <igEditors:ValueConstraint Nullable="False" MinLength="1"/> 
</x:XamTextEditor> 

答えて

1

注:私はこれに費やす余分な時間がたくさんあったしない限り、この場合、私はない - 完全 - 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()メソッドを呼び出します。

関連する問題