2013-04-30 130 views
4

我剛剛在WPF中找到了另一個綁定的奇怪點。考慮下面的類及其IStupid類型的屬性稱爲MyStupid綁定到接口類型的屬性

public struct DumbClass 
{ 
    public IStupid MyStupid { get { return new IsStupid(); } } 
} 
public interface IStupid{} 
public class IsStupid : IStupid{} 

現在考慮下面結合一個ListBox

var items = new List<DumbClass>(new []{new DumbClass(), new DumbClass(), new DumbClass()}); 
OptListBox.ItemsSource = items; 

沒有什麼特別之處XAML:

<ListBox Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" > 
</ListBox> 

正如所料,列表框的輸出是3行「MyProject.DumbClass」。

但是,如果我設置DisplayMemberPath="MyStupid"(或者創建一個ItemTemplate,將'MyStupid'直接綁定到模板中的TextBlock),我會得到3個空行,而我期望它會說MyProject.IsStupid。爲什麼數據綁定引擎無法調用默認的ToString()實現並顯示類名稱。是否有接口類型屬性的解決方法?至少,沒有綁定錯誤引發的原因嗎?

+0

對於除foo/bar之外的其他內容+1。 – 2013-04-30 22:30:23

+0

一個名爲'DumbClass'的結構是真的愚蠢,因爲它甚至沒有意識到它不是一個類。 – Dan 2013-04-30 22:31:45

+0

綁定錯誤永遠不會「拋出」。你可以在Visual Studio的輸出窗口看到任何綁定錯誤,你有什麼? – 2013-04-30 22:44:05

回答

3

我可以重現此問題。它看起來像WPF的錯誤。

這裏是你可以用變通方法: 相反的DisplayMemberPath的,您可以使用項目的DataTemplate中使用的StringFormat參數,這將屬性值強制轉換爲字符串:

<ListBox x:Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=MyStupid, StringFormat='{}{0}' }"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

一般來說,你可以使用WPF跟蹤設置,以弄清楚這樣的問題: enter image description here

但在這種情況下,因爲我看到沒有發生綁定錯誤。

此外,您可以使用WPF可視化的Visual Studio 2012,它允許你去調查從調試觀察樹權: enter image description here

使用下面的代碼,你可以用它的結合得到的TextBlock:

private void btn_Click_1(object sender, RoutedEventArgs e) 
    { 
     var listBoxItem = OptOccurances.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; 
     var item = OptOccurances.Items[1] as DumbClass; 
     var tbk = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(listBoxItem, 0),0),0) as TextBlock; 
     var binding = BindingOperations.GetBinding(tbk, TextBlock.TextProperty); 
     var be = BindingOperations.GetBindingExpression(tbk, TextBlock.TextProperty); 
     var vs = DependencyPropertyHelper.GetValueSource(tbk, TextBlock.TextProperty); 
     var val = tbk.GetValue(TextBlock.TextProperty); 
    } 

它顯示綁定狀態實際上是活動的,並且映射的對象是正確的。很明顯,Binding(PropertyPathWorker)的內部工作方式不同,以獲取屬性的值類型

+0

即使將跟蹤設置設置爲詳細,也沒有附加信息。不,結構不是問題 - 它和類一樣。不,字符串類型屬性工作正常。即使是IsStupid類型的屬性也能正常工作(與IStupid相反)。雖然對於wpf跟蹤設置,但它似乎是 – 2013-05-01 12:36:35

+0

+1的接口類型。 – 2013-05-01 12:42:15

+0

更新瞭解決方法 – 2013-05-01 20:40:45