Caliburn.Micro多元素自定义约定(NumericUpDown.Value,NumericUpDown.Maximum)

时间:2014-09-10 11:48:45

标签: caliburn.micro mahapps.metro

我一直在搞乱CM惯例试图了解它们是如何工作的,但我还没找到一个体面的文章,一步一步解释如何以及为什么。

但是,我发现了一些我一直在努力获得成功的代码片段。 但是,在这种情况下,我不明白发生了什么。

我试图将NumericUpDown Value和Maximum绑定到相应的ViewModel属性。我能够使用以下代码完成它:

ConventionManager.AddElementConvention<NumericUpDown>(NumericUpDown.ValueProperty, "Value", "ValueChanged");

最大

            ConventionManager.AddElementConvention<NumericUpDown>(NumericUpDown.MaximumProperty, "Maximum", "MaximumChanged");
        var baseBindProperties = ViewModelBinder.BindProperties;
        ViewModelBinder.BindProperties =
            (frameWorkElements, viewModels) =>
            {
                foreach (var frameworkElement in frameWorkElements)
                {
                    var propertyName = frameworkElement.Name + "Max";
                    var property = viewModels.GetPropertyCaseInsensitive(propertyName);
                    if (property != null)
                    {
                        var convention = ConventionManager.GetElementConvention(typeof(NumericUpDown));

                        ConventionManager.SetBindingWithoutBindingOverwrite(
                            viewModels,
                            propertyName,
                            property,
                            frameworkElement,
                            convention,
                            convention.GetBindableProperty(frameworkElement));
                    }
                }
                return baseBindProperties(frameWorkElements, viewModels);
            };

然而,这里有一个奇怪的部分,我只能使其中一个工作。这让我相信我在某处做了一些noob错误。我几乎只能调用AddElementConvention,因此只执行最后一次调用。

我很感激对这段代码的帮助,或者对一些可以帮助我的好文档的引用。

最好的问候

1 个答案:

答案 0 :(得分:0)

我发现某个地方CM只允许每个项目有一个约定,这就是这种行为的原因...

然而,由于像ComboBox这样的项目允许绑定多个属性(SelectedItem,ItemSource等等),我还没有完全相信...