2012-06-22 37 views
1

我想問一下,當綁定完成到「object」類型的對象時,WPF是否具有任何可以通過binding定義目標類型的功能。我有一個類型爲「object」的泛型集合,必須在其各個綁定點處理爲一個對象類型或其他(即DateTime,int等)。顯式設置WPF綁定數據類型

有沒有什麼辦法可以隨意強制.Net框架在編譯時將未知類型的對象作爲Type_X的對象,在處理綁定時根據具體情況進行處理?

+0

你可以做的是返回基於傳入的值類型的值轉換器。 – benjer3

回答

2

不,Binding類不提供任何此類功能;實際上它並不需要,Binding框架會自動將源對象轉換爲相關類型並使用綁定屬性值,否則會在找不到該屬性時引發綁定錯誤。

所以,如果我有Object類型的屬性在我ViewModel

public object Dummy 
{ 
    get 
    { 
     return dummy; 
    } 
    set 
    { 
     dummy = value; 
     NotifyPropertyChanged("Dummy"); 
    } 
} 

,我又把它綁定到一個TextBox這樣的 -

<TextBox Text="{Binding Dummy.Name}" HorizontalAlignment="Stretch"/> 

後來設置假人這樣一個對象 -

Dummy = new MyCustomType(); 

此時綁定將評估te並嘗試在源對象(Dummy)中找到Name屬性,並且如果MyCustomType定義了名爲Name的公共屬性,則會執行綁定,否則會發生綁定錯誤(沒有例外只是錯誤消息。在輸出窗口中)。現在

,在情況下,我想我的Dummy屬性設置爲兩種不同類型的對象(有Name一個和其他有FirstName),那麼我有兩個選擇 -

  1. 定義DataTemplates作爲Botz300建議
  2. 使用ValueConverter(它檢查對象類型並返回相關的屬性值)。

使用ValueConverter的另一變型限定TypeConverter做轉換和與所述TypeConverterAttribute聲明它,則在綁定的自動轉換將被完成。

同樣適用於收集對象。

更新:

是,WPF將隱式使用DefaultType轉換到你的類型轉換爲相應的顯示值。在情況下直接結合至Object(在上面的例子中Text)一個屬性然後WPF將使用TypeConverter爲該類型(如果有的話),或使用ToString()方法來獲得該顯示值。

但是,這一切取決於你所使用的顯示數據,以及如何/你所綁定的控件。

注意:這個技巧只適用於可以有簡單 文本表示的對象。處理複雜的數據對象時使用這種方便的技術可能沒有意義。

你可以通過這篇文章在MSDN其中談到這一點 - Customize Data Display with Data Binding and WPF

+0

你的回答聽起來很不錯,好像你已經理解了我的問題。在我的情況下,對象類型屬性只能保存「原始」類型,如整數,日期等。現在我只想綁定框架的行爲像屬性是特定類型。 客串,這就是你的意思是用ValueConverter。你能通過我的任何樣本嗎?是否有可能使用「默認」轉換器,該綁定框架似乎使用?或者我真的必須寫我自己的新轉換器? – user1039407

+0

綁定確實需要這樣做。例如,工具提示'= 「{結合價錢,的StringFormat = C}」':'StringFormat'是* *默默地忽略,因爲'ToolTip'是對象的類型。調試輸出中沒有任何內容。我知道,「儘可能無明顯原因的沉默失敗」是XAML的關鍵設計目標之一,但這並不意味着這是一個好主意。是的,有幾種方法可以通過StringFormat解決這個特定的問題。總有。 –

4

當然,你可以使用DataTemplates。每當你在StackPanel添加運行時類型YourType的對象在UI的地方,像

<DataTemplate DataType="{x:Type local:YourType}"> 
    <TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/> 
</DataTemplate> 

現在,模板會被使用:如果您在App.xaml中定義它們,它們將在全球範圍內應用。

+0

抱歉,這不是我要找的。例如,我試圖找到一種方法來綁定非特定類型的「object」屬性,就像它是DateTime類型一樣。 – user1039407

+0

@ user1039407因此,您有一個運行時類型爲'object'的對象,並希望它的行爲與日期時間類似?你會從哪裏得到實際的DateTime數據? – Botz3000

0

也許你可以設定爲d的設計時的DataContext:DataContext的 - 如果你只希望你的IDE知道什麼樣的數據呢不得不期待。

<ContextMenu ItemsSource="{Binding Shapes}" 
      DataContext="{Binding Data, Source={StaticResource BindingProxy}}" 
      d:DataContext="{d:DesignInstance tree:DesktopViewModel}"> 
    [items...] 
</ContextMenu> 

我有一個ContextMenu它得到它從BindingProxy DataContext的(其中有類型對象的數據屬性)。對於VS和ReSharper的正常工作,他們必須知道的DataContext的類型,所以我簡單地定義一個設計時的DataContext,現在他們知道這是一個DesktopViewModel

這隻適用於DataContext,不適用於任何綁定(因爲沒有DesignTimeBinding這樣的東西),但也許你可以重寫你的綁定來引用DataContext(或者將你的控件包裝在具有DataContext和d:DataContext的)。