Wpf 使用MVVM和Catel的自定义用户控件

Wpf 使用MVVM和Catel的自定义用户控件,wpf,user-controls,catel,Wpf,User Controls,Catel,我已经创建了一个自定义用户控件,它由一个带有选定项的自动完成框组成。。。到现在为止,我已经以一种我不喜欢的方式实现了它。。。我的意思是我有一个XAML视图,一个Viewmodel,在Viewmodel中我从存储过程加载数据。 由于AutoComplete框是第三方用户控件,所以我将其添加到XAML视图中,而不是定义为自定义用户控件。这样做的最佳实践是什么? 我认为我现在使用Catel作为MVVM框架的事实是易怒的 谢谢 更新#1 My usercontrols需要有一些通过XAML传递的属性,例

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

谢谢

更新#1 My usercontrols需要有一些通过XAML传递的属性,例如(LoadDefaultValue)

因为如果我只在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上,我使用了deferValidationUntillFirstSaveCall=true;在构造函数中禁用加载时的验证,但我的自定义usercontrols会在其周围显示红色边框。。。我应该如何将该信息传播到嵌套的UserControl


再次感谢

有关大量示例,请参见。这是一个开源库,有很多用Catel构建的用户控件,甚至还有一个自动完成的盒子。

我看过了,它们与我的非常相似。。我只有一个问题,这就是我打开该线程的原因…请查看我的更新是否检查了ViewToViewModel的内容(也在演示中)?我正在检查中,我缺少了[ViewToViewModel(MappingType=ViewToViewModelMappingType.TwoWayViewWins)]属性!
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)));
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;
        }
    }