C# WPF 自定控件 CustomControl


1 如果邏輯里的屬性與控件的屬性類型不匹配,要實現相應的IValueConverter

在這個例子里, 我把int型的Value綁定到TextBox的Text,intstring不能直接綁定,因此要實現一個Int2StringConverter,並在綁定時指定。否則不會顯示值。

<TextBox Text="{TemplateBinding Value, Converter={StaticResource Int2StringConverter}}"/>

2 Template與控件Logic務必分離
這里的分離是指:Logic不應知道具體的控件名,Logic只暴露依賴屬性(包括屬性+命令),Template負責綁定屬性。這種分離的好處是:如果用戶不喜歡你的Template,自己再定制一個,只需綁定到同樣的屬性+命令,即可實現控件的行為。否則用戶就無法改寫Template了。
錯誤的實現方式

private Button upBtn;
public override void OnApplyTemplate()
{
    upBtn = (Button)this.Template.FindName("btnUp", this);
    upBtn.Click = btn_Click;
}

這樣寫,就把Logic和Template綁死了。
正確的實現方式
//后台定義UpCommandProperty,實現為DelegateCommand或RoutedCommand,前台Template去綁定

public static readonly DependencyProperty UpCommandProperty = DependencyProperty.Register("UpCommand", typeof(ICommand), typeof(UpDownNumeric));
<Button Command="{TemplateBinding UpCommand}"/>

3 希望模板中的Button能執行CustonControl中某些特定的邏輯
對於這種情況,有兩種解決方法:TemplatePartAttribute和Command.
TemplatePartAttribute就是對UI中的元素命名, 然后在后台尋找此元素進行相應的操作.
很可惜, 這會使得UI與邏輯耦合, 這與CustomControl的初衷相悖.當外部程序改寫Template時,很有可能失去作用.

Command則十分可靠, 因為它能使UI和邏輯分離. 外部改寫UI后, 只需對相應的元素重新綁定內置的Command就可以正常地工作.
下面為大家如何內置Command和如何進行綁定.
在下面的后台代碼中, 對TestCommand進行聲明和初始化.
然后在靜態構造函數中通過CommandManager.RegisterClassCommandBinding(Type,CommandBinding)的方法進行類綁定(當然, 你也可以在構造函數中使用公共的CommandBindings集合,但這並不可靠,因為他人使用此控件時可以隨意修改CommandBindings)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM