2010-09-06 5 views
3

Je construis un simple, UserControl, DoubleDatePicker, qui définit un DependencyProperty, SelectedDate:La liaison est pas mis à jour comme prévu

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; 
     } 
    } 
} 

Je voudrais pouvoir lier la SelectedDate propriété de l'extérieur, mais les choses ne semblent pas si simple. Voici un exemple de code qui tente d'obtenir la valeur de la propriété dans un 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> 

et 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; 
     } 
    } 
} 

A l'intérieur du DoubleDatePicker lui-même tout fonctionne bien: le SelectedDate propriété est mis à jour lorsque changé en utilisant l'une des deux DatePicker et le TextBlock du DoubleDatePicker est mis à jour comme prévu.

Mais, en dehors, la TextBlock du MainWindow n'est pas mis à jour automatiquement et la seule façon d'obtenir le SelectedDate propriété du DoubleDatePicker est d'obtenir explicitement, comme cela se fait en cliquant sur le Bouton.

Qu'est-ce que je fais mal?

J'utilise Professional 2010 avec Visual Studio WPF 4.

Merci à l'avance pour vous aider.

Répondre

5

Ce que vous faites le mal est écrasez votre DataContext dans votre commande avec ceci:

this.DataContext = this; 

Maintenant, votre DatePicker ne se fixe à votre objet prévu, mais au lieu se fixe à votre instance DatePicker. Je suppose que ce n'est pas comme ça que vous avez prévu que votre DatePicker fonctionne;).Par conséquent, supprimez cette ligne dans votre DatePicker et, si vous avez besoin de lier à l'intérieur du code XAML de votre DatePicker, utilisez les liaisons ElementName ou RelativeSource pour lier cette propriété de dépendance.

espoir que cela clarifie les choses;)

je pris la liberté de réécrire vos liaisons à l'intérieur de votre XAML de votre DatePicker en utilisant les liaisons elementName:

<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

Merci pour votre réponse utile. J'ai supprimé la ligne d'affectation DataContext et utilisé la liaison avec ElementName: rien n'est cassé à l'intérieur de UserControl mais de l'extérieur je ne peux toujours pas obtenir la mise à jour automatiquement. Il manque quelque chose mais je ne devine pas quoi. – Pragmateek

+0

Lors de l'utilisation de votre propriété de dépendance, essayez ceci: SelectedDate = "{Bind SelectedDate, Mode = TwoWay}". Ce n'est probablement pas par défaut de TwoWay. Vous pouvez le rendre par défaut TwoWay si une classe FrameworkPropertyMetaData. – Arcturus

+1

Wow, vous avez totalement raison, merci beaucoup. Tu as fait ma journée. – Pragmateek

Questions connexes