绑定未按预期更新

3

我正在构建一个简单的 UserControl,名为 DoubleDatePicker,它定义了一个 DependencyProperty,名为 SelectedDate

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 属性会被更新,并且 DoubleDatePickerTextBlock 也会按预期更新。
但是,在外部,MainWindowTextBlock 不会自动更新,获取 DoubleDatePickerSelectedDate 属性的唯一方法是显式获取,就像点击 Button 时所做的那样。
我做错了什么?
我正在使用带有 WPF 4 的 Visual Studio Professional 2010。
提前感谢您的帮助。
1个回答

5
你做错的事情是在你的控件内部用以下代码覆盖了你的DataContext: ```` this.DataContext = new ViewModel(); ````
this.DataContext = this;

现在你的日期选择器不再绑定到你想要的对象,而是绑定到你的日期选择器实例。我猜这不是你希望你的日期选择器工作的方式;).

因此,请从你的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>

谢谢你的有帮助的回答。我已经移除了DataContext赋值行,并且使用了ElementName绑定:在UserControl内部没有任何问题,但是从外部仍然无法自动更新值。缺少一些东西,但我不知道是什么。 - Pragmateek
在使用您的依赖属性时,请尝试这样做:SelectedDate = "{Binding SelectedDate,Mode = TwoWay}"。它可能不是默认的TwoWay。然而,您可以通过FrameworkPropertyMetaData类将其设置为默认的TwoWay。 - Arcturus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接