【发布时间】:2011-04-23 12:48:14
【问题描述】:
我正在开发一个应用程序,其中Repository 对象通过包含TextBox 的modified 版本的DataTemplate 显示,它支持绑定到SelectionStart、SelectionLength 和VerticalOffset。
DataTemplate 如下所示:
<DataTemplate DataType="{x:Type m:Repository}">
<controls:ModdedTextBox
x:Name="textBox" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"
BindableSelectionStart="{Binding SelectionStart, UpdateSourceTrigger=PropertyChanged}"
BindableSelectionLength="{Binding SelectionLength, UpdateSourceTrigger=PropertyChanged}"
BindableVerticalOffset="{Binding VerticalOffset, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
问题是当我更改当前显示的Repository时; SelectionStart、SelectionLength 和 VerticalOffset 似乎都设置为 0,即使 Repository 对象的这些属性不是 0。
我认为这是发生在文本显示之前的瞬间SelectionStart、SelectionLength和VerticalOffset不能大于0。这不仅设置了@987654338的实际属性@ 为零,但也会更新绑定并将Repository 对象的属性设置为零。
有什么办法可以防止这种情况发生吗?
--编辑--
我不知道是否在 SO 上发布 dl 链接到项目是否禁止,但这里有一个指向我创建的项目的链接,以证明我遇到的问题:http://dl.dropbox.com/u/1520079/RepositoryProblemDemo.zip
当您运行演示应用程序时,您可以单击“切换存储库”按钮来更改文本框中显示的存储库。如果您查看文本框的右侧,当您切换到另一个时,当前存储库的属性都将设置为零。
这个演示和我的实际应用程序之间的区别在于,在我的应用程序存储库中,将通过热键而不是按钮来切换。
【问题讨论】:
-
您能否发布有关您的 Bindable*** 依赖属性是如何创建/绑定到基础 Selection 属性的信息?
-
您的绑定是否需要 2-way 并在 PropertyChanged 上触发,或者您是否可以使用 OneWay 或 LostFocus?
-
这就是 Bindable 依赖属性的创建方式。
-
@Steve,是的,它们确实需要在 PropertyChanged 上触发 2 向绑定。 Repository 对象的属性需要与 ui 同步,并且当前 Repository 对象的更改不会导致文本框失去焦点。
标签: wpf textbox datatemplate