2010-05-24 5 views
1

J'ai créé un objet avec une propriété simple avec une valeur par défaut. J'ai alors créé un contrôle d'utilisateur qui a une zone de texte dedans. J'ai mis le datacontext du contrôle d'utilisateur à l'objet.Liaison bidirectionnelle utilise un contrôle utilisateur ... liant à un objet, pas un élément?

La zone de texte affiche correctement la valeur par défaut des propriétés, mais je n'arrive pas à mettre à jour la valeur de la propriété lorsque l'utilisateur modifie la valeur de la zone de texte. J'ai créé un projet simple pour illustrer mon code.

Merci pour l'aide !!

public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     private string _titleValue; 

     public string TitleValue 
     { 
      get 
      { 
       return _titleValue; 
      } 
      set 
      { 
       _titleValue = value; 
       textBox1.Text = _titleValue; 
      } 
     } 

     public static readonly DependencyProperty TitleValueProperty = DependencyProperty.Register(
      "TitleValue", typeof(string), typeof(UserControl1), new FrameworkPropertyMetadata(new PropertyChangedCallback(titleUpdated)) 
      ); 

//Don't think I should need to do this!!! 
     private static void titleUpdated(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((UserControl1)d).TitleValue = (string)e.NewValue; 
     } 
    } 

<UserControl x:Class="WpfApplication1.UserControl1" 
      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="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBox Height="23" HorizontalAlignment="Left" Margin="94,97,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" 
        Text="{Binding Path=TitleValue, Mode=TwoWay}"/> 
    </Grid> 
</UserControl> 

    public partial class MainWindow : Window 
     { 
      public MainWindow() 
      { 
       InitializeComponent(); 

       var dummy = new DummyObject("This is my title."); 
       userControl11.DataContext = dummy; 

      } 

      private void button1_Click(object sender, RoutedEventArgs e) 
      { 
       MessageBox.Show("The value is: " + ((DummyObject)userControl11.DataContext).Title); 
      } 
     } 

    <Window x:Class="WpfApplication1.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1"> 
     <Grid> 
      <my:UserControl1 HorizontalAlignment="Left" Margin="95,44,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="191" Width="293" 
          TitleValue="{Binding Path=Title, Mode=TwoWay}"/> 
      <Button Content="Check Value" Height="23" HorizontalAlignment="Left" Margin="20,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
     </Grid> 
    </Window> 

Répondre

2

Le DataContext sur votre contrôle utilisateur n'est pas défini. Spécifiez un Name pour cela (j'appelle habituellement le mien "ThisControl") et modifiez la liaison de TextBox à Text="{Binding ElementName=ThisControl, Path=TitleValue, Mode=TwoWay}". Vous pouvez également définir le DataContext explicitement, mais je crois que c'est le moyen préféré.

Il semble que le DataContext par défaut soit "this", mais par défaut, ce n'est rien.

[edit] Vous pouvez également ajouter , UpdateSourceTrigger=PropertyChanged à votre liaison, comme par défaut TextBoxes 'Mise à jour de la liaison de texte seulement lorsque le focus est perdu.

+0

Je ne veux pas être stupide (il est difficile de bien!), Mais n'a pas établi que je quand dans cette ligne de code (MainWindow): var factice = new DummyObject (« Ceci est mon titre. ») ; userControl11.DataContext = dummy; Où puis-je définir cela? – Scott

+0

Je ne vous blâme pas, la courbe d'apprentissage initiale pour WPF est assez raide. Le DataContext que vous définissez est pour * cette instance * de UserControl1, mais ce dont je parle est le DataContext pour * la classe * de UserControl1, qui n'est pas définie. Au sommet où vous avez d: DesignHeight = "300" d: DesignWidth = "300">, ajoutez "Name =" ThisControl "" (ou quel que soit le nom que vous préférez). Puis faites la (les) modification (s) à la liaison que j'ai mentionnée ci-dessus. – JustABill

+0

Très bien, ça fonctionne. Merci beaucoup!!! Ok, une dernière question. Disons que je crée un autre contrôle utilisateur qui contient UserControl1, appelons-le UserControl2. Ensuite, je dépose UserControl2 sur la MainWindow et définit son datacontext à l'objet fictif. Dois-je ajouter une propriété de dépendance sur UserControl2? Désolé pour les questions .... – Scott

Questions connexes