1

Extended WPF Toolkitのコントロールを使用しており、IntegerUpDownCaliburn.Micro と PostSharp も使用しています。ViewModel のプロパティに基づいて、コントロールの最大値と最小値を設定しようとしています。

最小値または最大値を機能させることはできますが、両方を行うことはできません。したがって、私は明らかに最後のプロパティバインディングのみを許可することを行っています。これが私のAppBootstrapperクラスです:

using Caliburn.Micro;
using System.Windows;
using Xceed.Wpf.Toolkit;

namespace Test {
    public class AppBootstrapper : Bootstrapper<MainViewModel>{

        static AppBootstrapper() {
            var baseBindProperties = ViewModelBinder.BindProperties;

            ConventionManager.AddElementConvention<FrameworkElement>(IntegerUpDown.MinimumProperty, "Minimum", "ValueChanged");
            ViewModelBinder.BindProperties =
                (frameWorkElements, viewModels) => {
                    foreach (var frameworkElement in frameWorkElements) {
                        var propertyName = frameworkElement.Name + "Minimum";
                        var property = viewModels
                                .GetPropertyCaseInsensitive(propertyName);
                        if (property != null) {
                            var convention = ConventionManager
                                .GetElementConvention(typeof(FrameworkElement));
                            ConventionManager.SetBindingWithoutBindingOverwrite(
                                viewModels,
                                propertyName,
                                property,
                                frameworkElement,
                                convention,
                                convention.GetBindableProperty(frameworkElement));
                        }
                    }
                    return baseBindProperties(frameWorkElements, viewModels);
                };

            ConventionManager.AddElementConvention<FrameworkElement>(IntegerUpDown.MaximumProperty, "Maximum", "ValueChanged");
            ViewModelBinder.BindProperties =
                (frameWorkElements, viewModels) => {
                    foreach (var frameworkElement in frameWorkElements) {
                        var propertyName = frameworkElement.Name + "Maximum";
                        var property = viewModels
                                .GetPropertyCaseInsensitive(propertyName);
                        if (property != null) {
                            var convention = ConventionManager
                                .GetElementConvention(typeof(FrameworkElement));
                            ConventionManager.SetBindingWithoutBindingOverwrite(
                                viewModels,
                                propertyName,
                                property,
                                frameworkElement,
                                convention,
                                convention.GetBindableProperty(frameworkElement));
                        }
                    }
                    return baseBindProperties(frameWorkElements, viewModels);
                };
        }
    }
}

上記の例では、最大値が設定されていますが、最小値は設定されていません。最小バインディングが最後に設定されるようにそれらを入れ替えると、最小は機能しますが、最大は機能しません。ここで何が間違っていますか?

これを実行する場合の完全性のために、MainView.xaml は次のとおりです。

<Window x:Class="Test.MainView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBox Name="Text"/>
        <xctk:IntegerUpDown Name="Number"/>
        <Button Name="Click" Height="25" Content="Test"/>
    </StackPanel>
</Window>

および MainViewModel.cs:

using Caliburn.Micro;
using PostSharp.Patterns.Model;
using System;

namespace Test {

    [NotifyPropertyChanged]
    public class MainViewModel : Screen {

        public string Text { get; set; }

        public int Number { get; set; }

        public int NumberMaximum { get; set; }

        public int NumberMinimum { get; set; }

        public MainViewModel()
            : base() {
            this.NumberMinimum = 50;
            this.NumberMaximum = 100;
            this.Number = 75;
        }

        public void Click() {
            Console.WriteLine("Text: '"+this.Text+"'");
            Console.WriteLine("Number: '"+this.Number+"'");
        }

        protected void OnPropertyChanged(string propertyName) {
            NotifyOfPropertyChange(propertyName);
        }
    }
}
4

1 に答える 1