2010-09-08 51 views
1

我真的與ContentPresenter混淆。轉換器返回ContentPresenter - 奇怪的結果

我想構建一個具有輸入資源名稱並返回包含該資源的新實例的新ContentPresenter的轉換器。 似乎是顯而易見的,直接的,但是當我在XAML應用它的內容將...它是用來地方之間跳躍:

轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     var key = value.ToString(); 
     var control = new ContentPresenter(); 
     control.SetResourceReference(ContentPresenter.ContentProperty, key); 

     return control; 
    } 

該公司預計將包含名稱的字符串的資源並返回新的ContentPresenter與此資源。

在XAML中我使用了兩次:

<Window.Resources> 
    <Button x:Key="TestButton" Height="20" Width="30" Content="test"/> 
    <local:SelectResourceConverter x:Key="SelectResourceConverter" /> 
</Window.Resources> 
<StackPanel> 
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" /> 
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" /> 
</StackPanel> 

'資源' 屬性在後面的代碼定義:

public Window1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
    public string Resource 
    { 
     get { return "TestButton"; } 
    } 

更改ContentPresenter到ContentControl中給我轉換器中的元素已經在視覺樹中的例外。這給了我一個線索,即SetResourceReference()返回兩次相同的實例,但我不知道如何更改代碼來提供幫助。

您的幫助將非常感激。

回答

2

這聽起來像是您想要使用DataTemplate的場景。

在設置ContentTemplateProperty而不是轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) 
     return null; 

    var key = value.ToString(); 
    var control = new ContentPresenter(); 
    control.SetResourceReference(ContentPresenter.ContentTemplateProperty, key); 

    return control; 
} 

在XAML中,定義一個DataTemplate 「TestButton」:

<Window.Resources> 
    <DataTemplate x:Key="TestButton"> 
     <Button Height="20" Width="30" Content="test"/> 
    </DataTemplate> 
    <local:SelectResourceConverter x:Key="SelectResourceConverter" /> 
</Window.Resources> 
<StackPanel> 
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" /> 
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" /> 
</StackPanel> 

如果我不是忘了什麼東西,這應該是足夠了。通過DataTemplate,您將獲得Converter創建的每個ContentPresenter的新按鈕實例。

雖然你會得到一個Button中的Button和你的代碼,你知道嗎?不知道你爲什麼要這樣做......

+0

這正是我正在尋找的答案。謝謝! – 2010-09-08 07:32:34

+0

而且我意識到按鈕中的按鈕沒有任何意義 - 它只是一個真實生活示例的簡化版本:) – 2010-09-08 08:14:18