数据绑定到 WPF 中的 UserControl - 无法取回值
Data binding to a UserControl in WPF - cant get Value back
我有一个 UserControl,我想在其中实现数据绑定。
我只是无法将输入返回到绑定。
用户控件:
<UserControl x:Class="WPFLibrary.UserControls.LabeledTextBox"
x:Name="root" ... >
<StackPanel Orientation="Horizontal" Width="270" Height="30">
<Label Content="LabelNotDef" Width="100" Name="BaseLabel"
HorizontalAlignment="Left" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" />
<TextBox Margin="0,0,20,0" Name="BaseTextBox" Width="150" Height="25" VerticalContentAlignment="Center"
Text="{Binding ElementName=root, Path=Text2, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</UserControl>
用户控件的隐藏代码:
public partial class LabeledTextBox : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public static DependencyProperty TextProperty = DependencyProperty.Register("Text2", typeof(string), typeof(EffLabeledTextBox),
new PropertyMetadata(string.Empty, OnTextPropertyChanged));
[Browsable(true)]
public string Text2
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
private static void OnTextPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
EffLabeledTextBox myUserControl = dependencyObject as EffLabeledTextBox;
myUserControl.OnPropertyChanged("Text2");
myUserControl.OnTextPropertyChanged(e);
}
private void OnTextPropertyChanged(DependencyPropertyChangedEventArgs e)
{
BaseTextBox.Text = Text2;
}
public LabeledTextBox()
{
InitializeComponent();
}
}
在另一个 UserControl 中实现:
<uCon:LabeledTextBox x:Name="Toastbread" Tabelle="artikel" Feld="nr" Text2="{Binding _strNR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
代码隐藏:
public partial class ArtikelSearch : UserControl
{
ArtikelSearchVM objVM;
public ArtikelSearch()
{
InitializeComponent();
objVM = new ArtikelSearchVM();
this.DataContext = objVM;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string a23 = Toastbread.Text2;
string a24 = Toastbread.BaseTextBox.Text;
System.Diagnostics.Debugger.Break();
objVM.Suche();
}
}
当我在文本字段中输入内容时触发 PropertyChanged。如果我检查 Toastbread.Text2,我会得到值。如果我检查 Toastbread.BaseTextBox.Text 我得到值。但是如果我检查 objVM._strNR 我只会得到 null。
当我在 ArtikelSearchVM 构造函数的 objVM._strNR 上手动设置一个值时,它在框中,但我也没有从文本框中取回修改后的值。
您无需在 UserControl 中实现 INotifyPropertyChanged。这就是您所需要的:
public partial class LabelTextBox : UserControl
{
public LabelTextBox()
{
InitializeComponent();
}
public static DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(LabelTextBox));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
像这样 XAML:
<UserControl ...>
...
<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},
Path=Text, UpdateSourceTrigger=PropertyChanged}" .../>
...
</UserControl>
您也可以考虑使 Text
属性 默认双向绑定:
public static DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(LabelTextBox),
new FrameworkPropertyMetadata(string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
我有一个 UserControl,我想在其中实现数据绑定。 我只是无法将输入返回到绑定。
用户控件:
<UserControl x:Class="WPFLibrary.UserControls.LabeledTextBox"
x:Name="root" ... >
<StackPanel Orientation="Horizontal" Width="270" Height="30">
<Label Content="LabelNotDef" Width="100" Name="BaseLabel"
HorizontalAlignment="Left" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" />
<TextBox Margin="0,0,20,0" Name="BaseTextBox" Width="150" Height="25" VerticalContentAlignment="Center"
Text="{Binding ElementName=root, Path=Text2, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</UserControl>
用户控件的隐藏代码:
public partial class LabeledTextBox : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public static DependencyProperty TextProperty = DependencyProperty.Register("Text2", typeof(string), typeof(EffLabeledTextBox),
new PropertyMetadata(string.Empty, OnTextPropertyChanged));
[Browsable(true)]
public string Text2
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
private static void OnTextPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
EffLabeledTextBox myUserControl = dependencyObject as EffLabeledTextBox;
myUserControl.OnPropertyChanged("Text2");
myUserControl.OnTextPropertyChanged(e);
}
private void OnTextPropertyChanged(DependencyPropertyChangedEventArgs e)
{
BaseTextBox.Text = Text2;
}
public LabeledTextBox()
{
InitializeComponent();
}
}
在另一个 UserControl 中实现:
<uCon:LabeledTextBox x:Name="Toastbread" Tabelle="artikel" Feld="nr" Text2="{Binding _strNR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
代码隐藏:
public partial class ArtikelSearch : UserControl
{
ArtikelSearchVM objVM;
public ArtikelSearch()
{
InitializeComponent();
objVM = new ArtikelSearchVM();
this.DataContext = objVM;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string a23 = Toastbread.Text2;
string a24 = Toastbread.BaseTextBox.Text;
System.Diagnostics.Debugger.Break();
objVM.Suche();
}
}
当我在文本字段中输入内容时触发 PropertyChanged。如果我检查 Toastbread.Text2,我会得到值。如果我检查 Toastbread.BaseTextBox.Text 我得到值。但是如果我检查 objVM._strNR 我只会得到 null。
当我在 ArtikelSearchVM 构造函数的 objVM._strNR 上手动设置一个值时,它在框中,但我也没有从文本框中取回修改后的值。
您无需在 UserControl 中实现 INotifyPropertyChanged。这就是您所需要的:
public partial class LabelTextBox : UserControl
{
public LabelTextBox()
{
InitializeComponent();
}
public static DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(LabelTextBox));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
像这样 XAML:
<UserControl ...>
...
<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},
Path=Text, UpdateSourceTrigger=PropertyChanged}" .../>
...
</UserControl>
您也可以考虑使 Text
属性 默认双向绑定:
public static DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(LabelTextBox),
new FrameworkPropertyMetadata(string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));