2010-09-20 105 views
1

我正在使用格式豐富的ListBox的應用程序。我需要的一件事就是將多條信息綁定到ListBox的DataTemplate中的按鈕。WPF - DataTemplate - 在附加屬性中使用元素綁定

這是我爲了幫助你理解問題所做的實際代碼的過度簡化。

這裏是XAML的一大塊從工作原理的DataTemplate內:

<Button Command="local:MediaCommands.StreamVideo" 
    CommandParameter="{Binding Path=Folder}" /> 

當我按下按鈕,它發出,這份名單是根據各地的數據項的Folder財產(的ItemsSource成員說當前列表項目正在顯示)。但是,我需要另一塊數據,即當前項目的Filename屬性。爲了達到這個目的,我創建了一個新類FileInfo,它包含FolderFilename的依賴項屬性。

<Button Command="local:MediaCommands.StreamVideo"> 
    <Button.CommandParameter> 
     <data:FileInfo Folder="{Binding Path=Folder}" 
      Filename="{Binding Path=Filename}" /> 
    </Button.CommandParameter> 
</Button> 

但是,我的代碼是給我的唯一的事情是一個空白FileInfo對象:然後,我之前更換了XAML代碼。請注意,如果我將上面的XAML更改爲包含FolderFilename的文字值,則代碼可以正常工作,因爲它可以正確創建FileInfo對象並分配正確的屬性。

僅供參考,我FileInfo類看起來有點像這樣:

class FileInfo : DependencyObject { 
    public static readonly DependencyProperty FolderProperty; 
    public static readonly DependencyProperty FilenameProperty; 
    static FileInfo() { 
     FolderProperty = DependencyProperty.Register("Folder", 
      typeof(string), typeof(FileInfo)); 
     FilenameProperty = DependencyProperty.Register("Filename", 
      typeof(string), typeof(FileInfo)); 
    } 
    public string Folder { 
     get { return (string) GetValue(FolderProperty); } 
     set { SetValue(FolderProperty, value); } 
    } 
    public string Filename { 
     get { return (string) GetValue(FilenameProperty); } 
     set { SetValue(FilenameProperty, value); } 
    } 
} 

忽略的事實是,在這種情況下,我可以簡單地傳遞給數據對象本身的引用(在我的實際應用中,我需要從嵌套的ListBox中抽取數據,但問題是一樣的),任何人都可以看到這裏發生了什麼?我的依賴項屬性沒有被正確聲明?我是否需要對綁定做一些古怪的事情?

+0

非常令人費解。有一件事可以幫助我找出綁定問題,即在Debug - > Exceptions - > Managed Debugging Assistants - > BindingFailure下啓用拋出的選項。也許調試器會告訴你一些有用的東西,如果你這樣做。 – Jacob 2010-09-20 20:09:31

+0

我啓用了該功能,但沒有報告任何額外的內容。它一定是別的東西。 – Ethan 2010-09-20 20:31:58

回答

3

未明確聲明源的綁定依賴於DataContext作爲其源。您尚未在FileInfo實例上聲明DataContext,這通常意味着將使用繼承的DataContext。 DataContext繼承取決於FrameworkElement和運行時Visual Tree,當您使用分配給不顯示在樹中的屬性的非FrameworkElement派生類時,這兩者都不會起作用。

+0

我試着讓'FileInfo'繼承自'FrameworkElement'而不是'DependencyObject',但那並沒有解決問題。我誤解了你的解決方案嗎? – Ethan 2010-09-20 20:26:21

+2

John也提到了該對象必須是Visual Tree的一部分才能使DataContext繼承工作。在你的情況下,FileInfo不是。所以它沒有選擇DataContext。無論如何,上面的一個可能的解決方案是有一個IValueConverter,返回給定您的數據類的FileInfo實例。這樣做,你的CommandParameter將被聲明爲

+0

我看到的問題(可能不是問題)是我的數據不僅僅來自我的數據類。相反,我需要數據類中的字段和數據模板中其他元素('ListBox')的兩個字段。嚴格地說,我可以簡單地返回沒有參數,並編程按鈕的回調,因此它遍歷元素樹,但這將需要很多工作,並且會非常不雅。我覺得應該有更好的解決方案。 – Ethan 2010-09-20 20:44:59