任何人都可以解釋爲什麼綁定在TagObject
下面的代碼引發以下綁定異常?爲什麼這個基本的綁定失敗,例外?
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Value; DataItem=null; target element is 'TagObject' (HashCode=37895910); target property is 'Value' (type 'String')
我懷疑是因爲其本身TagObject
不是FrameworkElement
子類,所以它沒有一個數據上下文本身,因此不知道如何解決的XAML綁定。
爲了測試,我將基本類型TagObject
更改爲FrameworkElement
,果然,綁定錯誤消失了,但Value
仍然沒有更改。我的理論雖然是現在有效的綁定,TagObject
不是可視樹的一部分,因此它沒有繼承它的DataContext
。
我也嘗試給'TextBlock a name, then specifying it as the
元素名稱in the binding, but that again threw a binding exception. In this case, my suspicion is that it can't find the named element because
即使上面的基類更改,TagObject仍然不是可視樹的一部分。
爲了記錄,我確實知道一個解決方案是簡單地將該對象創建隱藏在ValueConverter後面以便爲我包裝,但是我想知道是否有僅用於XAML的解決方案來解決TagObject
上的綁定問題。
這裏的XAML:
<Window x:Class="Test.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:test="clr-namespace:Test">
<Window.Resources>
<DataTemplate DataType="{x:Type test:DataObject}">
<TextBlock Text="{Binding Value}">
<TextBlock.Tag>
<test:TagObject Value="{Binding Value}" />
</TextBlock.Tag>
</TextBlock>
</DataTemplate>
</Window.Resources>
<ListBox x:Name="MainListBox" BorderThickness="0" />
</Window>
這也不行......
<TextBlock x:Name="MyTextBlock" Text="Test">
<TextBlock.Tag>
<test:TargetObject Value="{Binding DataContext.Value, ElementName=MyTextBlock}" />
</TextBlock.Tag>
</TextBlock>
下面的代碼:
using System.Windows;
using System.Collections.ObjectModel;
namespace Test
{
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
var sourceItems = new ObservableCollection<DataObject>();
for(int i = 1; i <= 10; i++)
sourceItems.Add(new DataObject() { Value = "Item " + i});
MainListBox.ItemsSource = sourceItems;
}
}
public class DataObject : DependencyObject
{
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(string),
typeof(DataObject),
new UIPropertyMetadata(null));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
public class TagObject : DependencyObject
{
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(string),
typeof(TagObject),
new UIPropertyMetadata(null));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
}
BindingException的確切消息是什麼? – Heinzi
請注意,我更新了這個例外的問題,以及我認爲可能是潛在原因的其他信息。 – MarqueIV