AvalonEdit を MVVM に対応させるには C# でどうしたらよいか
AvalonEditをMVVMに対応させるには、以下の手順に従います。
- AvalonEdit をバインドするカスタムコントロール(例:AvalonEditControl)を作成します。
- AvalonEditControl に Text プロパティを追加し、AvalonEdit のテキスト内容をバインドします。
- AvalonEditControlに、テキスト内容が変更されたときに発火するTextChangedイベントを追加します。
- Binding を使用して AvalonEditControl の Text プロパティを AvalonEdit の Text プロパティにバインドし、 UpdateSourceTrigger を PropertyChanged に設定して、テキストの内容が変更されるたびにバインドソースを更新するようにします。
- AvalonEditControlのTextChangedイベントハンドラで、Textプロパティの設定によってテキスト内容の変更通知をトリガーする。
以下のコード例を示します。
public class AvalonEditControl : UserControl
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text", typeof(string), typeof(AvalonEditControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public AvalonEditControl()
{
var avalonEdit = new AvalonEdit.TextEditor();
avalonEdit.SetValue(AvalonEdit.TextEditor.TextProperty, Text);
avalonEdit.TextChanged += AvalonEdit_TextChanged;
Content = avalonEdit;
}
private void AvalonEdit_TextChanged(object sender, EventArgs e)
{
var avalonEdit = (AvalonEdit.TextEditor)sender;
Text = avalonEdit.Text;
}
}
MVVMモード使用時には、AvalonEditControlをビューに追加して、ViewModel中の対応するプロパティとTextプロパティをバインドします。
たとえば、ViewModel に AvalonEdit のテキスト内容を保持する Code プロパティがある場合:
public class MyViewModel : INotifyPropertyChanged
{
private string _code;
public string Code
{
get { return _code; }
set
{
_code = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Code)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
XAML で AvalonEditControl をバインドするには、次のように記述します。
<local:AvalonEditControl Text="{Binding Code, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
そうすると、Codeプロパティの変更が自動的にAvalonEditControlに更新され、またAvalonEditControlのテキスト内容の変更も自動的にCodeプロパティに更新されます。