使用MVVM和Catel进行自定义用户控制

时间:2015-07-21 12:51:57

标签: wpf user-controls catel

我已经创建了一个自定义用户控件,它由一个带有选定项的AutoCompleteBox组成......到现在为止我已经用我不喜欢的方式实现了...我的意思是我有一个XAML视图,一个Viewmodel和viewmodel我从存储过程加载数据。 由于AutoComplete框是第三方UserControl,我已将其添加到XAML视图中,而不是定义为自定义用户控件。这样做的最佳做法是什么? 我认为我现在使用Catel作为MVVM框架的事实是不相关的..

谢谢

更新#1

我的usercontrols需要有一些通过XAML传递的属性(例如LoadDefaultValue)

<views:PortfolioChooserView x:Name="PortfolioChooserView" DataContext="{Binding Model.PortfolioModel}" Height="25" LoadDefaultValue="True" Width="150" />

要实现这样的场景,我必须在我的PortfolioChooserView中定义一个依赖属性,定义为

public bool LoadDefaultValue
    {
        get { return (bool)GetValue(LoadDefaultValueProperty); }
        set { SetValue(LoadDefaultValueProperty, value); }
    }

    public static readonly DependencyProperty LoadDefaultValueProperty = DependencyProperty.Register(
  "LoadDefaultValue", typeof(bool), typeof(PortfolioChooserView), new PropertyMetadata(default(bool)));

因为如果我只在Viewmodel中定义它,我就无法设置它。

奇怪的是,为了将它传递给viewmodel我必须做这样的伎俩

public PortfolioChooserView()
    {
        InitializeComponent();
        if (!isFirstLoad) return;

        Focusable = true;
        PortfolioCompleteBox.AllowDrop = true;
        PortfolioCompleteBox.Focus();

        DragDropManager.AddPreviewDragOverHandler(PortfolioCompleteBox, OnElementDragOver);
        DragDropManager.AddDropHandler(PortfolioCompleteBox, OnElementDrop);

        DataContextChanged += PortfolioChooserView_DataContextChanged;
        isFirstLoad = false;
    }

    void PortfolioChooserView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var dataContext = DataContext as PortfolioModel;

        if (dataContext != null)
        {
            dataContext.LoadDefaultValue = LoadDefaultValue;
            dataContext.AllowNull = AllowNull;

            //var converter = new PortfolioConverter();

            //var portfolio = (Portfolio) converter.Convert(SelectedItem, null, null, CultureInfo.CurrentCulture);
            //dataContext.SelectedItem = portfolio;
        }
    }

但我真的不喜欢使用DataContextChanged事件......你看到了更好的方法吗? 感谢

更新#2

我保持这一点,因为这是一个相关的问题...... 在一些viewmodel上我使用了DeferValidationUntilFirstSaveCall = true;在构造函数中禁用加载时的验证但我的自定义用户控件显示周围的红色边框...我该怎么做才能将该信息传播到嵌套的用户控件?

enter image description here

再次感谢

1 个答案:

答案 0 :(得分:1)

请参阅Orc.Controls了解大量示例。它是一个开源库,有很多用Catel构建的用户控件,甚至还有一个带有自动完成框的用户控件。