我在网格中有2个列表视图。每个列表视图都包含一个文本框,两个列表视图中的两个文本框都具有相同的文本。当我在任一文本框中选择部分文本时,另一个文本框也将选择文本的相同部分。
可以在两个不同的listview中的两个文本框之间进行绑定吗?
答案 0 :(得分:2)
正如AngelWPF所写,Selection * -properties不是依赖属性,所以你不能在它们上使用数据绑定。
您可以做的是添加自己的TextBox子项,该子项具有替换原始属性的依赖项属性。这些可以使用与原始属性相同的名称实现为常规依赖项属性,但它们的定义必须为 public new
才能替换原始属性。
我不会在这里发布整个代码示例(代码太多而我在这台计算机上没有它),但您可以执行以下操作:
public class BindableSelectionTextBox : TextBox
{
// Defines the dependency property as normal
public static readonly DependencyProperty SelectedTextProperty =
DependencyProperty.RegisterAttached(SelectedText, typeof(string),
typeof(BindableSelectionTextBox),
new FrameworkPropertyMetadata("", SelectedTextPropertyChanged));
private static void SelectedTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = (TextBox)d;
textBox.SelectedText = (string)e.NewValue;
}
public new string SelectedText
{
get { return (string)GetValue(SelectedTextProperty); }
set
{
if(value != SelectedText)
{
SetValue(SelectedTextProperty, value);
}
}
}
public BindableSelectionTextBox()
{
SelectionChanged += OnSelectionChanged;
}
private void OnSelectionChanged(object sender, RoutedEventArgs e)
{
SelectedText = base.SelectedText;
}
}
现在,您必须对SelectionStart
和SelectionLength
属性重复此操作,您应该完成。
答案 1 :(得分:1)
可悲的是,因为SelectionText
,SelectionLength
和SelectionStart
不是依赖属性,所以这两个文本框可以双向绑定在这些属性上。
您必须编写附加行为,将一个文本框附加到另一个文本框并为两者处理TextBox.SelectionChangedEvent
,并在处理事件时同步另一个。