C# 用户控件绑定在值更新时丢失,这不会';标准文本框控件不会发生这种情况

C# 用户控件绑定在值更新时丢失,这不会';标准文本框控件不会发生这种情况,c#,wpf,xaml,binding,user-controls,C#,Wpf,Xaml,Binding,User Controls,我在usercontrol中绑定有问题 这是我的用户控件: UserControl1.xaml 这是主窗口: MainWindow.xaml 我发现了一些类似的问题: 但我不能完全理解发生了什么:为什么一个标准的文本框能像预期的那样工作,而我的用户控件却不能 或者更好:有没有办法让我的usercontrol与文本框的行为一起工作?绑定必须是双向的,或者显式设置 <local:UserControl1 HmiField="{Binding Prop1, Mode=TwoWay}"/&g

我在usercontrol中绑定有问题

这是我的用户控件:

UserControl1.xaml 这是主窗口:

MainWindow.xaml 我发现了一些类似的问题:

但我不能完全理解发生了什么:为什么一个标准的文本框能像预期的那样工作,而我的用户控件却不能


或者更好:有没有办法让我的usercontrol与文本框的行为一起工作?

绑定必须是双向的,或者显式设置

<local:UserControl1 HmiField="{Binding Prop1, Mode=TwoWay}"/>
文本框的
Text
属性注册如上所示,即默认情况下使用
bindstwoway
标志


在UserControl的XAML中的
文本框
绑定中,您可能还希望在用户键入时更新源属性(而不是仅在失去焦点时):


当Prop1发生变化时,它会发出通知,但您还没有告诉绑定在该通知上触发。
尝试在绑定中包含UpdateSourceTrigger=PropertyChanged

您所说的“不工作”是什么意思?对于TextBox和UserControl1,您的代码似乎工作相同。非常简单。。。太明显了!非常感谢你,克莱门斯!我在没有看到证据的情况下迷失了方向!!!
namespace WpfApp1
{
    public partial class UserControl1 : UserControl
    {

        public double HmiField
        {
            get { return (double)GetValue(HmiFieldProperty); }
            set { SetValue(HmiFieldProperty, value); }
        }
        public static readonly DependencyProperty HmiFieldProperty =
            DependencyProperty.Register("HmiField", typeof(double), typeof(UserControl1));

        public UserControl1()
        {
            InitializeComponent();
        }
    }
}
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        DataContext="{Binding Md, RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="450" Width="800">
    <UniformGrid>
        <Button Content="{Binding Prop1}" Click="Button_Click"/>
        <Label Content="{Binding Prop1}"/>
        <TextBox Text="{Binding Prop1}"/>
        <local:UserControl1 HmiField="{Binding Prop1}"/>
    </UniformGrid>
</Window>
namespace WpfApp1
{

    public class tMd: INotifyPropertyChanged
    {
        #region Interfaccia INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }

        #endregion

        private double prop1;
        public double Prop1 { get
            {
                return prop1;
            }
            set
            {
                if (prop1 != value)
                {
                    prop1 = value;
                    NotifyPropertyChanged("Prop1");
                }
            }
        }
    }

    public partial class MainWindow : Window
    {

        public tMd Md
        {
            get { return (tMd)GetValue(MdProperty); }
            set { SetValue(MdProperty, value); }
        }
        public static readonly DependencyProperty MdProperty =
            DependencyProperty.Register("Md", typeof(tMd), typeof(MainWindow), new PropertyMetadata(new tMd()));

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Md.Prop1 = 1234.5678;
        }
    }
}
<local:UserControl1 HmiField="{Binding Prop1, Mode=TwoWay}"/>
public static readonly DependencyProperty HmiFieldProperty =
    DependencyProperty.Register(
        nameof(HmiField), typeof(double), typeof(UserControl1),
        new FrameworkPropertyMetadata(
            0d, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
<TextBox Text="{Binding HmiField,
                ElementName=usercontrol,
                UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding HmiField,
                RelativeSource={RelativeSource AncestorType=UserControl}
                UpdateSourceTrigger=PropertyChanged}"/>