我想問一下,當綁定完成到「object
」類型的對象時,WPF是否具有任何可以通過binding
定義目標類型的功能。我有一個類型爲「object
」的泛型集合,必須在其各個綁定點處理爲一個對象類型或其他(即DateTime
,int
等)。顯式設置WPF綁定數據類型
有沒有什麼辦法可以隨意強制.Net框架在編譯時將未知類型的對象作爲Type_X
的對象,在處理綁定時根據具體情況進行處理?
我想問一下,當綁定完成到「object
」類型的對象時,WPF是否具有任何可以通過binding
定義目標類型的功能。我有一個類型爲「object
」的泛型集合,必須在其各個綁定點處理爲一個對象類型或其他(即DateTime
,int
等)。顯式設置WPF綁定數據類型
有沒有什麼辦法可以隨意強制.Net框架在編譯時將未知類型的對象作爲Type_X
的對象,在處理綁定時根據具體情況進行處理?
不,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
),那麼我有兩個選擇 -
DataTemplates
作爲Botz300建議ValueConverter
(它檢查對象類型並返回相關的屬性值)。使用ValueConverter
的另一變型限定TypeConverter
做轉換和與所述TypeConverterAttribute
聲明它,則在綁定的自動轉換將被完成。
同樣適用於收集對象。
更新:
是,WPF將隱式使用DefaultType
轉換到你的類型轉換爲相應的顯示值。在情況下直接結合至Object
(在上面的例子中Text
)一個屬性然後WPF將使用TypeConverter
爲該類型(如果有的話),或使用ToString()
方法來獲得該顯示值。
但是,這一切取決於你所使用的顯示數據,以及如何/你所綁定的控件。
注意:這個技巧只適用於可以有簡單 文本表示的對象。處理複雜的數據對象時使用這種方便的技術可能沒有意義。
你可以通過這篇文章在MSDN其中談到這一點 - Customize Data Display with Data Binding and WPF
你的回答聽起來很不錯,好像你已經理解了我的問題。在我的情況下,對象類型屬性只能保存「原始」類型,如整數,日期等。現在我只想綁定框架的行爲像屬性是特定類型。 客串,這就是你的意思是用ValueConverter。你能通過我的任何樣本嗎?是否有可能使用「默認」轉換器,該綁定框架似乎使用?或者我真的必須寫我自己的新轉換器? – user1039407
綁定確實需要這樣做。例如,工具提示'= 「{結合價錢,的StringFormat = C}」':'StringFormat'是* *默默地忽略,因爲'ToolTip'是對象的類型。調試輸出中沒有任何內容。我知道,「儘可能無明顯原因的沉默失敗」是XAML的關鍵設計目標之一,但這並不意味着這是一個好主意。是的,有幾種方法可以通過StringFormat解決這個特定的問題。總有。 –
當然,你可以使用DataTemplates
。每當你在StackPanel
添加運行時類型YourType
的對象在UI的地方,像
<DataTemplate DataType="{x:Type local:YourType}">
<TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/>
</DataTemplate>
現在,模板會被使用:如果您在App.xaml中定義它們,它們將在全球範圍內應用。
抱歉,這不是我要找的。例如,我試圖找到一種方法來綁定非特定類型的「object」屬性,就像它是DateTime類型一樣。 – user1039407
@ user1039407因此,您有一個運行時類型爲'object'的對象,並希望它的行爲與日期時間類似?你會從哪裏得到實際的DateTime數據? – Botz3000
也許你可以設定爲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的)。
你可以做的是返回基於傳入的值類型的值轉換器。 – benjer3