簡體   English   中英

用戶控件綁定因值更新而丟失,這在標准文本框控件中不會發生

[英]Usercontrol binding lost on value updated, that doesn't happen with standard textbox control

我在usercontrol中綁定有問題。

這是我的用戶控件:

UserControl1.xaml

<UserControl x:Class="WpfApp1.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-ompatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d" 
    x:Name="usercontrol"
    d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBox Text="{Binding HmiField, ElementName=usercontrol}"/>
    </Grid>
</UserControl>

UserControl1.xaml.cs

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

這是主窗口:

MainWindow.xaml

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

MainWindow.xaml.cs

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

我發現了一些類似的問題:

如何更改TextBox.Text而不丟失WPF中的綁定?

WPF:綁定更新時,綁定丟失

WPF文本框TwoWay綁定在datatemplate中即使在LostFocus上也不會更新源

但是我無法完全理解正在發生的事情:為什么標准文本框可以按預期工作,而我的用戶控件卻沒有?

或更妙的是:有沒有辦法讓我的usercontrol可以處理文本框的行為?

綁定必須是TwoWay,必須明確設置

<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屬性,即使用BindsTwoWayByDefault標志。


在UserControl的XAML中的TextBox綁定中,您可能還希望在用戶鍵入時更新source屬性(而不是僅失去焦點):

<TextBox Text="{Binding HmiField,
                ElementName=usercontrol,
                UpdateSourceTrigger=PropertyChanged}"/>

或沒有其他無用的生成的usercontrol字段:

<TextBox Text="{Binding HmiField,
                RelativeSource={RelativeSource AncestorType=UserControl}
                UpdateSourceTrigger=PropertyChanged}"/>

您的Prop1會在更改時通知您,但您尚未告訴您綁定以觸發該通知。 嘗試在綁定中包括UpdateSourceTrigger = PropertyChanged

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM