自定义控件 public partial class ZRichTextBox : RichTextBox
{
static ZRichTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ZRichTextBox), new FrameworkPropertyMetadata(typeof(ZRichTextBox)));
} public ZRichTextBox()
{
this.DataContext = new ViewModel.ZRichTextBoxViewModel(this);
var colorPicker = this.FindName("fontColorPicker");
var colorPicker1 = this.GetTemplateChild("fontColorPicker");
}
}模版是写在Themes/Generic.xaml里面的
这里都得不到控件的实例这是为什么呢?
谢谢
{
static ZRichTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ZRichTextBox), new FrameworkPropertyMetadata(typeof(ZRichTextBox)));
} public ZRichTextBox()
{
this.DataContext = new ViewModel.ZRichTextBoxViewModel(this);
var colorPicker = this.FindName("fontColorPicker");
var colorPicker1 = this.GetTemplateChild("fontColorPicker");
}
}模版是写在Themes/Generic.xaml里面的
这里都得不到控件的实例这是为什么呢?
谢谢
那我这里的public ZRichTextBox() { this.DataContext = new ViewModel.ZRichTextBoxViewModel(this); var colorPicker = this.FindName("fontColorPicker"); var colorPicker1 = this.GetTemplateChild("fontColorPicker"); } 我的MVVM里面要得到这控件就得把这个写在OnApplyTemplate?
public ColorPicker ColorPicker { get; set; }
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var colorPicker = this.GetTemplateChild("fontColorPicker");
this.ColorPicker = colorPicker as ColorPicker;
this.DataContext = new ViewModel.ZRichTextBoxViewModel(this);
}然后在MVVM中
this.UC.ColorPicker.SelectColorCompleted += ColorPicker_SelectColorCompleted;
实现了我修改颜色的功能
但这样写科学吗?
应该怎么写
colorPicker.SelectColorCompleted += viewModel.ColorPicker_SelectColorCompleted;从MVVM的角度讲,你在ViewModel中访问了ui上的元素,是违反它的规则的。
相反在code behind中访问vm,这是允许的。而且,在写custom control的时候,其实并不存在code behind,这个类文件就是自定义控件本身了,而xaml只是控件的呈现模板。事实上,generic.xaml是缺省模板,还可以定义其它theme样式下的各种模板。
所以概念上custom control是“lookless”的,这个上次也提到过。MVVM最适合的场合是解决业务/界面直接解偶的问题,而UserControl, custom control大多数其实只是和UI相关。并不包括业务层,特别是custom control, 我觉得它就应该设计成单一功能的UI模块,所以既然没有business model,就没有必要用mvvm。你看color picker也没有用view model。当然也有用vm的例子:FindReplaceDialog(不过我觉得把FindReplaceMgr看成一个组件,把FindReplaceDialog看成它用到的一个对话框更合适)。
所以我觉得可以根据需要和具体情况灵活掌握,不必太死板了。层次分的越多,阅读代码、修改维护其实都更复杂,要权衡使用。