我整天坐在一边,试图找出为什么绑定到AvalonEdits文档属性不起作用。 AvalonEdit是一个先进的WPF文本编辑器 - SharpDevelop项目的一部分(将在SharpDevelop v4 Mirador中使用)。WPF调试AvalonEdit绑定到文档属性
因此,当我建立一个简单的项目 - 一个TextEditor(这是库中的AvalonEdits实名)并且创建了一个具有一个属性的简单类--Document并且它返回一个带有一些静态文本的虚拟对象,该绑定正在工作完美。
但是在现实生活中,我将SomeEditor对象的集合绑定到TabControl。 TabControl具有用于SomeEditor的DataTemplate,并且存在TextEditor对象。
<TabControl Grid.Column="1" x:Name="tabControlFiles" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<TabControl.Resources>
<DataTemplate DataType="{x:Type m:SomeEditor}">
<a:TextEditor
Document="{Binding Path=Document, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource NoopConverter}, IsAsync=True}"
x:Name="avalonEdit"></a:TextEditor>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style BasedOn="{StaticResource TabItemStyle}" TargetType="{x:Type TabItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}"></Setter>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
这是行不通的。什么到目前为止,我已经调查:
- 文本编辑的DataContext设置
- TextEditors文件属性设置为一些其他的实例比SomeEditor.Document财产
- SomeEditor的正常情况下,当我设置断点附加到该绑定它无操作器显示我要文件的正确值(转换器使用!)
我还通过挖的VisualTree获得参考文本编辑,并呼吁GetBindingExpression(TextEditor.DocumentProperty),这没有任何回报
WPF产生以下信息:
System.Windows.Data信息:10:使用结合和没有有效的回退值存在无法检索值;改为使用默认值。 BindingExpression:路径=文档; DataItem ='SomeEditor'(HashCode = 26280264);目标元素是'TextEditor'(Name ='avalonEdit');目标属性为'文档'(类型'TextDocument')
绑定到的SomeEditor实例已经在绑定发生之前创建并缓存了Document的副本。吸气剂从不叫。
任何人都可以告诉我什么可能是错的?为什么BindingExpression没有设置?为什么属性getter不会被调用?
//编辑:新的考验,新成果
我读过一些,并设置在代码背后的结合。当我这样做的时候,它会有效。 如何在XAML中设置它不起作用,并在代码中做同样的事情呢?
//编辑2:在将对象添加到用作更高级别DataSource的可观察集合后(即在xaml绑定应激后不久),该代码也会失败。这让我觉得这是计时问题。任何人都可以讲述这件事吗?
// EDIT3:绑定代码:
private List<T> GetObjectOfTypeInVisualTree<T>(DependencyObject dpob) where T : DependencyObject
{
int count = VisualTreeHelper.GetChildrenCount(dpob);
List<T> returnlist = new List<T>();
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(dpob, i);
T childAsT = child as T;
if (childAsT != null)
{
returnlist.Add(childAsT);
}
List<T> lst = GetObjectOfTypeInVisualTree<T>(child);
if (lst != null)
{
returnlist.AddRange(lst);
}
}
if (returnlist.Count > 0)
{
return returnlist;
}
return null;
}
private void RebindMenuItem_Click(object sender, RoutedEventArgs e)
{
foreach (XHTMLStudioPrototypeFileEditor ed in CurrentProject.OpenedFiles)
{
List<ContentPresenter> cps = GetObjectOfTypeInVisualTree<ContentPresenter>(tabControlFiles);
if (cps != null)
{
foreach (ContentPresenter cp in cps)
{
foreach (DataTemplate dt in tabControlFiles.Resources.Values)
{
try
{
object o = dt.FindName("avalonEdit", cp);
TextEditor ted = (TextEditor)o;
bool isDataBound = BindingOperations.IsDataBound(ted, TextEditor.DocumentProperty);
if (!isDataBound)
{
BindingOperations.SetBinding(ted, TextEditor.DocumentProperty, new Binding("Document"));
}
Console.WriteLine(isDataBound);
}
catch (Exception)
{
}
}
}
}
}
}
您可以显示您用于以编程方式创建绑定的代码吗?另外,如果删除IsAsync,会发生什么情况? – JustABill 2010-06-09 01:39:10
如果我删除IsAsync,则不会发生任何情况。我正在尝试每个组合都有它的工作。 – kubal5003 2010-06-09 07:19:34