加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

wpf – 依赖属性不更新我的Usercontrol

发布时间:2020-12-13 20:11:08 所属栏目:百科 来源:网络整理
导读:下面的行适用于TextBox DP Text,其中CellNo是从INotifyPropertychanged派生的类的属性.所以在这里,当我更改CellNo文本将被更新,当我更改CellNo文本将被更新.这样会很好. Text="{Binding Path = CellNo,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 我
下面的行适用于TextBox DP Text,其中CellNo是从INotifyPropertychanged派生的类的属性.所以在这里,当我更改CellNo文本将被更新,当我更改CellNo文本将被更新.这样会很好.
Text="{Binding Path = CellNo,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

我创建了一个仅包含一个TextBox的用户控件.我已经定义了一个DP名称CellValue如下:

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

现在当我在任何一个对话框中使用这个用户控件,并且执行与上述相同的绑定,目标(用户控件中的TextBox)不会被更新.

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

另外在用户控件内部,我将TextBox的Text属性绑定到CellValue DP.

内部用户控制

<TextBox                 
        Text="{Binding Path = CellValue}"
        Name="textBox2" />

我想要当CellValue更改时,TextBox文本也应该被更新,但是使用上面的appoach它仍然是空白的.

这段代码
<local:control x:Name="control"  
               CellValue="{Binding Path=CellNo,UpdateSourceTrigger=PropertyChanged}">

正试图绑定UserControl的Property CellNo.添加RelativeSource或ElementName,它将工作.

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

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

您可能还需要将控件的DataContext设置为自身

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

更新

您可以下载此here的示例应用程序.

否则,这是我的完整示例代码.

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,UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="Update CellNo" Height="23" HorizontalAlignment="Left" Margin="185,149,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,etc...    
    public static readonly DependencyProperty CellValueProperty =
        DependencyProperty.Register("CellValue",});
    public control()
    {
        InitializeComponent();
        this.DataContext = this;
        CellValue = "Test";
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读