依赖项属性未更新我的Usercontrol [英] Dependency Property is not updating my Usercontrol
问题描述
下面的行适用于TextBox DP Text ,其中CellNo是从INotifyPropertychanged派生的类的属性.所以在这里,当我更改CellNo时,文本将被更新,而当我更改CellNo时,文本将被更新.这会很好.
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 CellNo the Text will be updated and When I change the CellNo the Text will be updated. This will work fine.
Text="{Binding Path = CellNo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
我创建了一个仅包含一个TextBox的用户控件.我已经定义了一个DP名称CellValue,如下所示:
I have create a user control which contain only one TextBox. I have defined one DP name CellValue as below:
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)不会更新.
Now when I use this user control in any dialog and do the same binding as above, the Target ( TextBox inside User control) is NOT updating.
<local:control
x:Name="control"
CellValue="{Binding Path = CellNo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
还在用户控件内部,我将TextBox的Text属性绑定到CellValue DP.
Also inside user control I have binded the Text Property of TextBox to CellValue DP.
内部用户控制
<TextBox
Text="{Binding Path = CellValue}"
Name="textBox2" />
我希望当CellValue更改时,TextBox文本也应更新,但是通过上述方法,它仍然为空白.
I want when the CellValue changes the TextBox Text should also be updated, but with the above appoach it remains blank.
推荐答案
此代码
<local:control x:Name="control"
CellValue="{Binding Path=CellNo,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}">
试图绑定到UserControl的属性CellNo.添加RelativeSource或ElementName即可.
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}">
您可能还需要将控件的DataContext设置为其自身
You may also need to set the the DataContext of control to itself
public control()
{
InitializeComponent();
this.DataContext = this;
//...
}
更新
您可以在此处下载示例应用程序.
You can download a sample application of this here.
否则,这是我的完整示例代码.
Otherwise, here's my full sample code.
MainWindow.xaml
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
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
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
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";
}
}
这篇关于依赖项属性未更新我的Usercontrol的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!