Господа, день добрый. Пишу проект на .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'
Здравствуйте, Namelles.One, Вы писали:
NO>Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.
А не подойдет DatePicker из
WPF Toolkit?
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Namelles.One, Вы писали:
NO>>Господа, день добрый. Пишу проект на .NET 3.5, понадобился DateTimePicker, взял оный из Windows Forms.
MM>А не подойдет DatePicker из WPF Toolkit?
К сожалению нет, я его смотрел, он не поддерживает время в строке. Или все-таки поддерживает, а я слеп?
Необходимо, чтобы можно было выбирать дату из gui, а время просто отображать — для тех строк, которые будут заполнены из кода.
Здравствуйте, 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 — это тоже нужный функционал, а все это допиливать — как-то не айс(