Binding in WinForms over WPF
От: Namelles.One  
Дата: 26.12.10 18:23
Оценка:
Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.

Разбираюсь с проблемой байндинга к Windows Forms элементам. Нагуглил один интересный код, но, к сожалению, он не работает. Проблема в том, что мне он кажется абсолютно рабочим, видимо не хватает фактических знаний. Помогите, пожалуйста, разобраться, почему не работает как должно?


    public class Proxy : FrameworkElement
    {
        public static readonly DependencyProperty InProperty;
        public static readonly DependencyProperty OutProperty;

        private delegate void Operation();

        public Proxy()
        {
            Visibility = Visibility.Collapsed;
        }

        static Proxy()
        {
            FrameworkPropertyMetadata inMetadata = new FrameworkPropertyMetadata(
                delegate(DependencyObject p, DependencyPropertyChangedEventArgs args)
                {
                    if (null != BindingOperations.GetBinding(p, OutProperty))
                        ((Proxy) p).Out = args.NewValue;
                }) {BindsTwoWayByDefault = false, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};

            InProperty = DependencyProperty.Register("In",
                typeof(object),
                typeof(Proxy),
                inMetadata);

            FrameworkPropertyMetadata outMetadata = new FrameworkPropertyMetadata(
                delegate(DependencyObject p, DependencyPropertyChangedEventArgs args)
                {
                    ValueSource source = DependencyPropertyHelper.GetValueSource(p, args.Property);

                    if (source.BaseValueSource != BaseValueSource.Local)
                    {
                        Proxy proxy = p as Proxy;
                        if (proxy != null)
                        {
                            object expected = proxy.In;
                            if (!ReferenceEquals(args.NewValue, expected))
                            {
                                Dispatcher.CurrentDispatcher.BeginInvoke(
                                    DispatcherPriority.DataBind, new Operation(delegate
                                                                                   {
                                                                                       proxy.Out = proxy.In;
                                                                                   }));
                            }
                        }
                    }
                }) {BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};

            OutProperty = DependencyProperty.Register("Out",
                typeof(object),
                typeof(Proxy),
                outMetadata);
        }

        public object In
        {
            get { return GetValue(InProperty); }
            set { SetValue(InProperty, value); }
        }

        public object Out
        {
            get { return GetValue(OutProperty); }
            set { SetValue(OutProperty, value); }
        }
    }


Пример вызова такой:


<help:Proxy In="{Binding Path=CardOrder.MainInfo.CreationDate}" Out="{Binding ElementName=CreatedDate, Path=Value}" />
<WindowsFormsHost Name="windowsFormsHost1" MinWidth="120">
    <WinForms:DateTimePicker x:Name="CreatedDate"/>
</WindowsFormsHost>


Вообще, код интересный, в случае его допиливания — поможет решить много проблем и не мне одному.

27.12.10 06:14: Перенесено из '.NET'
Re: Binding in WinForms over WPF
От: MxMsk Португалия  
Дата: 26.12.10 19:09
Оценка:
Здравствуйте, Namelles.One, Вы писали:

NO>Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.

А не подойдет DatePicker из WPF Toolkit?
Re[2]: Binding in WinForms over WPF
От: Namelles.One  
Дата: 26.12.10 19:15
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Namelles.One, Вы писали:


NO>>Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.

MM>А не подойдет DatePicker из WPF Toolkit?

К сожалению нет, я его смотрел, он не поддерживает время в строке. Или все-таки поддерживает, а я слеп?
Необходимо, чтобы можно было выбирать дату из gui, а время просто отображать — для тех строк, которые будут заполнены из кода.
Re[3]: Binding in WinForms over WPF
От: Namelles.One  
Дата: 26.12.10 19:20
Оценка:
Здравствуйте, Namelles.One, Вы писали:

NO>Здравствуйте, MxMsk, Вы писали:


MM>>Здравствуйте, Namelles.One, Вы писали:


NO>>>Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.

MM>>А не подойдет DatePicker из WPF Toolkit?

NO>К сожалению нет, я его смотрел, он не поддерживает время в строке. Или все-таки поддерживает, а я слеп?

NO>Необходимо, чтобы можно было выбирать дату из gui, а время просто отображать — для тех строк, которые будут заполнены из кода.

Правда, уже возникла идея скачать исходники WPF Toolkit и допилить до нужного себе функционала. Но, те не менее, код из первого сообщения тоже хотелось бы сделать рабочим.

P.S. Вспомнил, что в WinForms можно добавить checkbox в datetime picker — это тоже нужный функционал, а все это допиливать — как-то не айс(
Re[3]: Binding in WinForms over WPF
От: notacat  
Дата: 27.12.10 00:42
Оценка: +1
NO>К сожалению нет, я его смотрел, он не поддерживает время в строке. Или все-таки поддерживает, а я слеп?
В принципе, если с клавиатуры дату и время вводить — то он все парсит. Только не отображает потом. Надо или в темплейт добавлять отображение времени, или использовать исходный код и дорабатывать, либо наследоваться и допиливать. Но для наследования он плохо приспособлен, слишком многое реализовано как internal
Re[4]: Binding in WinForms over WPF
От: Namelles.One  
Дата: 27.12.10 07:05
Оценка:
Здравствуйте, notacat, Вы писали:

NO>>К сожалению нет, я его смотрел, он не поддерживает время в строке. Или все-таки поддерживает, а я слеп?

N>В принципе, если с клавиатуры дату и время вводить — то он все парсит. Только не отображает потом. Надо или в темплейт добавлять отображение времени, или использовать исходный код и дорабатывать, либо наследоваться и допиливать. Но для наследования он плохо приспособлен, слишком многое реализовано как internal

Эксперимент с кодом WPF Toolkit провалился, Студия 2010 даже собрать не может его, не то, чтобы код допиливать.

Итого, жду или еще идей или помощи с кодом из первого сообщения. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.