【发布时间】:2024-04-21 09:15:02
【问题描述】:
我正在尝试使用 MVVM 模式让 AvalonEdit 正常工作,但我真的不知道该怎么做。我想将 SelectionLength 和 SelectionStart 绑定到我的 ViewModel,以便在执行某些业务逻辑时可以访问这两个值。
我开始像这样创建 DependencyProperties:
public class MvvmTextEditor : TextEditor, INotifyPropertyChanged
{
/// <summary>
/// A bindable Text property
/// </summary>
public new string Text
{
get { return base.Text; }
set {
base.Text = value;
RaisePropertyChanged();
}
}
/// <summary>
/// A bindable SelectionStart property
/// </summary>
public new int SelectionStart
{
get { return base.SelectionStart; }
set {base.SelectionStart = value; }
}
/// <summary>
/// A bindable SelectionLength property
/// </summary>
public new int SelectionLength
{
get { return base.SelectionLength; }
set { base.SelectionLength = value; }
}
/// <summary>
/// The bindable selection start property dependency property
/// </summary>
public static readonly DependencyProperty SelectionStartProperty =
DependencyProperty.Register("SelectionStart", typeof(int), typeof(MvvmTextEditor),
new PropertyMetadata((o, args) =>
{
var target = (TextEditor)o;
target.SelectionStart = (int)args.NewValue;
}));
/// <summary>
/// The bindable selection length property dependency property
/// </summary>
public static readonly DependencyProperty SelectionLengthProperty =
DependencyProperty.Register("SelectionLength", typeof(int), typeof(MvvmTextEditor),
new PropertyMetadata((o, args) =>
{
var target = (MvvmTextEditor) o;
target.SelectionLength = (int)args.NewValue;
Debug.WriteLine(target.SelectionLength);
}));
/// <summary>
/// The bindable text property dependency property
/// </summary>
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MvvmTextEditor),
new PropertyMetadata((o, args) =>
{
var target = (MvvmTextEditor)o;
target.Text = (string)args.NewValue;
}));
/// <summary>
/// Raises a property changed event
/// </summary>
/// <param name="property">The name of the property that updates</param>
public void RaisePropertyChanged([CallerMemberName] string caller = "")
{
var handler = PropertyChanged;
if (handler != null)
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
public event PropertyChangedEventHandler PropertyChanged;
}
TextDependencyProperty 工作正常,但 SelectionLength 和 SelectionStart 不工作。
我已经为 SelectionChanged 添加了一个事件处理程序(但我不完全是我在这里使用 SetValue 所做的:
public MvvmTextEditor()
{
TextArea.SelectionChanged += TextArea_SelectionChanged;
}
void TextArea_SelectionChanged(object sender, EventArgs e)
{
SetValue(SelectionStartProperty, SelectionStart);
SetValue(SelectionLengthProperty, SelectionLength);
}
现在可以进行选择,但是向后进行选择时会出现问题。在这种情况下,SelectionStart 始终为 0。如果到目前为止我所做的一切都是正确的,那么我将创建一个逻辑,如果有人向后选择,它将正确转换索引和长度。我必须在 PropertyMetaDataDelegate 中实现这个逻辑吗?
【问题讨论】:
-
您在这方面取得了进展吗?
-
不,对不起。但我不希望将 AvalonEdit 与 MVVM 一起使用。如果你这样做,你会遇到太多问题。
-
没错,但我真的别无选择。您没有调查为什么无法反向选择的原因?
标签: c# mvvm dependency-properties avalonedit