2010-09-06 60 views
3

我建立一个简单的用户控件DoubleDatePicker,它定义了的DependencyPropertySelectedDate绑定不更新预期

DoubleDatePicker.xaml

<UserControl x:Class="TestWpfDoubleDatePicker.DoubleDatePicker" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit">  
<StackPanel x:Name="LayoutRoot" Background="White"> 
    <toolkit:DatePicker x:Name="DateInput" SelectedDate="{Binding SelectedDate,Mode=TwoWay}" Margin="5,0,5,0" /> 
    <TextBlock Text="{Binding SelectedDate}" /> 
    <toolkit:DatePicker SelectedDate="{Binding SelectedDate,Mode=TwoWay}" Margin="5,0,5,0" /> 
</StackPanel> 

DoubleDatePicker.xaml.cs

using System; 
using System.Windows; 
using System.Windows.Controls; 


namespace TestWpfDoubleDatePicker 
{ 
    public partial class DoubleDatePicker : UserControl 
    { 
     public static readonly DependencyProperty SelectedDateProperty = 
     DependencyProperty.Register("SelectedDate", typeof(DateTime), typeof(DoubleDatePicker), null); 

     public DateTime SelectedDate 
     { 
      get { return (DateTime)this.GetValue(SelectedDateProperty); } 
      set { this.SetValue(SelectedDateProperty, value); } 
     } 

     public DoubleDatePicker() 
     { 
      this.InitializeComponent(); 

      this.DataContext = this; 
     } 
    } 
} 

我希望能够在SelectedDate财产来自外部约束,但事情似乎没有那么简单。 这里是试图获得在的TextBlock属性值的示例代码:

MainWindow.xaml

<Window x:Class="TestWpfDoubleDatePicker.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestWpfDoubleDatePicker" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel x:Name="LayoutRoot" Background="White"> 
    <local:DoubleDatePicker x:Name="ddp" SelectedDate="{Binding SelectedDate}" /> 
    <Button Content="Update" Click="Button_Click" /> 
    <TextBlock Text="{Binding SelectedDate}" /> 
</StackPanel> 

MainWindow.xaml.cs

using System; 
using System.Windows; 

namespace TestWpfDoubleDatePicker 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public static readonly DependencyProperty SelectedDateProperty = 
      DependencyProperty.Register("SelectedDate", typeof(DateTime), typeof(MainWindow), null); 

     public DateTime SelectedDate 
     { 
      get { return (DateTime)this.GetValue(SelectedDateProperty); } 
      set { this.SetValue(SelectedDateProperty, value); } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      this.DataContext = this; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      this.SelectedDate = this.ddp.SelectedDate; 
     } 
    } 
} 

里面的DoubleDatePicker本身所有工作正常:当使用任何两个的DatePicker的改变SelectedDate属性更新,并如期TextBlock中DoubleDatePicker被更新。

但是,外面的主窗口的TextBlock不会自动更新,并得到DoubleDatePickerSelectedDate财产的唯一方法就是把它明确的,喜欢它点击时的完成按钮

我在做什么错?

我使用Visual Studio专业2010 WPF 4

提前感谢您帮助。

回答

5

你在做什么错与此覆盖你控制你里面的DataContext:

this.DataContext = this; 

现在你的DatePicker不再绑定到你的预期目的,但在代替结合您的DatePicker实例。我想这不是你想让你的DatePicker工作的方式;)。

因此,删除DatePicker中的该行,并且如果确实需要在DatePicker的XAML中绑定,请使用ElementNameRelativeSource绑定来绑定到此依赖项属性。

希望这澄清的东西;)

我把你重写使用的ElementName绑定您的DatePicker的XAML内您的绑定的自由:

<UserControl x:Class="TestWpfDoubleDatePicker.DoubleDatePicker" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
x:Name="Root">  
<StackPanel x:Name="LayoutRoot" Background="White"> 
    <toolkit:DatePicker x:Name="DateInput" SelectedDate="{Binding ElementName=Root, Path=SelectedDate,Mode=TwoWay}" Margin="5,0,5,0" /> 
    <TextBlock Text="{Binding ElementName=Root, Path=SelectedDate}" /> 
    <toolkit:DatePicker SelectedDate="{Binding ElementName=Root, Path=SelectedDate,Mode=TwoWay}" Margin="5,0,5,0" /> 
</StackPanel> 
+0

感谢您有用的答案。我已经删除了DataContext赋值行并使用了ElementName的绑定:在UserControl内部没有任何内容被破坏,但是从外部我仍然无法自动更新值。有些东西缺失,但我不知道是什么。 – Pragmateek 2010-09-06 13:05:51

+0

当使用你的依赖属性时,试试这个:SelectedDate =“{Binding SelectedDate,Mode = TwoWay}”。它可能不是TwoWay的默认设置。你可以通过一个FrameworkPropertyMetaData类来使它成为TwoWay默认值。 – Arcturus 2010-09-06 13:11:34

+1

哇,你是完全正确的,非常感谢。你让我今天一整天都感觉很好。 – Pragmateek 2010-09-06 14:49:13