Dependency Property is not updating my Usercontrol

前端 未结 1 975
既然无缘
既然无缘 2020-12-16 19:38

The line below works for the TextBox DP Text, where CellNo is a property of a class which derives from INotifyPropertychanged. So here when I change the Cel

相关标签:
1条回答
  • 2020-12-16 20:08

    This code

    <local:control x:Name="control"  
                   CellValue="{Binding Path=CellNo,
                                       Mode=TwoWay,
                                       UpdateSourceTrigger=PropertyChanged}">
    

    is trying to bind against the Property CellNo of the UserControl. Add RelativeSource or ElementName and it'll work.

    <local:control x:Name="control"  
                   CellValue="{Binding Path=CellNo,
                                       RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
                                       Mode=TwoWay,
                                       UpdateSourceTrigger=PropertyChanged}">
    
    <local:control x:Name="control"  
                   CellValue="{Binding Path=CellNo,
                                       ElementName=myWindow,
                                       Mode=TwoWay,
                                       UpdateSourceTrigger=PropertyChanged}">
    

    You may also need to set the the DataContext of control to itself

    public control()
    {
        InitializeComponent();
        this.DataContext = this;
        //...
    }
    

    Update

    You can download a sample application of this here.

    Otherwise, here's my full sample code.

    MainWindow.xaml

    <Window x:Class="DependencyPropertyInsideUserControl.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:DependencyPropertyInsideUserControl"
            Title="MainWindow" Height="350" Width="525"
            Name="myWindow">
        <Grid>
            <local:control x:Name="control"
                           CellValue="{Binding Path = CellNo, Mode=TwoWay, ElementName=myWindow, UpdateSourceTrigger=PropertyChanged}"/>
                <Button Content="Update CellNo" Height="23" HorizontalAlignment="Left" Margin="185,149,0,0" Name="button1" VerticalAlignment="Top" Width="94" Click="button1_Click" />
        </Grid>
    </Window>
    

    Mainwindow.xaml.cs

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            CellNo = "Hello";
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            CellNo = "Hi";
        }
        private string m_cellNo;
        public string CellNo
        {
            get
            {
                return m_cellNo;
            }
            set
            {
                m_cellNo = value;
                OnPropertyChanged("CellNo");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    control.xaml

    <UserControl x:Class="DependencyPropertyInsideUserControl.control"
                 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 Text="{Binding Path = CellValue}" 
                     Name="textBox2" />
        </Grid>
    </UserControl>
    

    control.xaml.cs

    public partial class control : UserControl
    {
        public string CellValue
        {
            get { return (string)GetValue(CellValueProperty); }
            set { SetValue(CellValueProperty, value); }
        }
        // Using a DependencyProperty as the backing store for LimitValue.  This enables animation, styling, binding, etc...    
        public static readonly DependencyProperty CellValueProperty =
            DependencyProperty.Register("CellValue", typeof(string), typeof(control), new FrameworkPropertyMetadata
            {
                BindsTwoWayByDefault = true,
            });
        public control()
        {
            InitializeComponent();
            this.DataContext = this;
            CellValue = "Test";
        }
    }
    
    0 讨论(0)
提交回复
热议问题