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