3

正如标题所说,我想将 ViewModel 中的属性绑定到相应视图中的嵌套 UserControl。我不能让它按我需要的方式工作。

嵌套的 UserControl 只不过是几个小时的 aDatePicker和 a DropDown。如何告诉DatePicker选择 ViewModel 传播的日期作为其选定日期?

我几乎尝试了一切,现在我离跳窗不远了。如您所见,感谢您提供任何帮助;)

现在到到目前为止的代码:DateTimePicker.xaml.cs (CodeBehind)

public partial class DateTimePicker
{
    public static DependencyProperty SelectedDateValueProperty = DependencyProperty.Register("SelectedDateValue", typeof (DateTime), typeof (DateTimePicker), new FrameworkPropertyMetadata(default(DateTime), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnPropertyChangedCallback));

    private static void OnPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
    {
        Debug.WriteLine("Wohoo. I'm here and still debugging...");
    }

    public DateTimePicker()
    {
        InitializeComponent();

        DataContext = this;

        var times = GetTimes();

        Times.ItemsSource = times;
        Times.SelectedItem = times.First();
    }

    public DateTime SelectedDateValue
    {
        get { return (DateTime) GetValue(SelectedDateValueProperty); }
        set { SetValue(SelectedDateValueProperty, value); }
    }
}

嵌套的 UserControl (DateTimePicker.xaml):

<UserControl x:Class="Framework.Controls.DateTimePicker"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d" 
         d:DesignHeight="30" d:DesignWidth="200"
         DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>
    <DatePicker HorizontalAlignment="Left" Name="DatePickerCalendar" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" SelectedDate="{Binding SelectedDateValue}" />
    <ComboBox Grid.Column="1" VerticalAlignment="Center" Name="Times" DisplayMemberPath="Name" />
</Grid>

最后但并非最不重要的一点是:具有嵌套 UserControl (View.xaml) 的视图

<CustomControls:DateTimePicker SelectedDateValue="{Binding LocalRegistrationStartDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

希望问题很清楚,任何人都可以帮助我或了解我在这里做错了什么。

4

2 回答 2

6

使用:

"{Binding SelectedDateValue}"

告诉 WPF“嘿,检查我DataContext的一个名为SelectedDateValue”的属性。

你想要的是,Property从你的用户控制中获取。

最简单的方法是给您的用户控件起一个名称,例如:

<UserControl x:Name="myControl"/>

然后将您的绑定修改为:

"{Binding ElementName=myControl, Path=SelectedDateValue}"
于 2012-04-18T15:07:50.310 回答
1

实现 WPF 控件的常用方法是使用模板,而不是将控件定义为直接内容,就像您在此处所做的那样。通过使用Template,您可以访问TemplateBinding,从而可以轻松绑定控件属性。请参阅控件自定义MSDN 页面。

<ControlTemplate TargetType="{x:Type local:DateTimePicker>
  ...
  <DatePicker SelectedDate="{TemplateBinding SelectedDateValue}" />
  ...
</ControlTemplate>
于 2012-04-18T15:20:25.623 回答