2012-05-10 32 views
0

該主題是我定義了一個綁定到DataContext的自定義控件。我希望根據DataContext的特定屬性值動態更改控件模板。如何在WPF中有效地更改控件模板?

我想到了兩種方式,但我不知道哪種方式更好。

1.不要在ResourceDictionary中使用控件模板,並且控件的所有細節都在C#代碼中定義。使用DependencyProperty CallBack方法在DataContext的屬性值更改時呈現控件。

2.在ResourceDictionary中定義控件模板並使用DataTrigger來更改'Control.Template'屬性。

在我的應用程序中,會創建成千上萬個此類型的實例,所以如果ControlTemplate changging無效,這實在是不可接受的。

您能否給我一些建議或更好的解決方案?

+0

模板渲染完成後是否需要更改模板?所以控件加載後屬性值發生了變化? –

+0

當屬性值發生變化時,應該更改模板。例如,屬性'Shape'可能具有不同的值,例如'Triangle''Rectangle''Circle'等等,當值爲改變。 @Martin Moser – Claw

回答

1

如果涉及數千個複雜控件實例,則使用任何標準的WPF技術可能無效。請參閱http://msdn.microsoft.com/en-us/magazine/dd483292.aspx

我會用MultiBinding + IMultiValueConverter到Control.Template依賴項屬性,因爲Template取決於多個DataContext屬性,可能會涉及複雜的邏輯。

+0

謝謝!上面的文章真的很有幫助! – Claw

0

也許你可以在你的ControlTemplate使用ContentPresenter自定義您的控制的部分。您可以爲自動應用的可自定義部件提供DataTemplate

+0

謝謝!但我想找出哪種方式更好,尤其是效率必須考慮在內。 – Claw

0

我會用數據觸發器的樣式來控制顯示哪個模板。像這樣的例子:

<Style x:Key="Die1Face" TargetType="{x:Type Button}"> 
     <Setter Property="Template" Value="{StaticResource dieNone}" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=ThrowDie1[0]}" Value="1" > 
       <Setter Property="Template" Value="{StaticResource dieOneA}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=ThrowDie1[0]}" Value="2" > 
       <Setter Property="Template" Value="{StaticResource dieTwoA}" /> 
      </DataTrigger> 
    </Style.Triggers> 
    </Style> 

這會給你需要的靈活性。