我在这里遗漏了什么吗?我已经创建了一个带有属性的usercontrol,并且为了参数,它中有一个文本框。
<UserControl x:Class="Isd.Utility.SystemMonitorWpf.Bar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBlock x:Name="txtExpected" Grid.Column="0" Grid.ColumnSpan="2" Width="auto" Height="auto" FontSize="10" LayoutTransform="{StaticResource Rotate}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Tahoma" Foreground="Red" Panel.ZIndex="100" Margin="5,5,5,5"/>
然后在我背后的代码中
public partial class Bar : UserControl
{
private string _PropTest;
public string PropTest
{
get { return _PropTest; }
set { _PropTest = value; }
}
public Bar()
{
InitializeComponent();
txtExpected.Text = PropTest;
}
}
然后我将usercontrol放入xaml并将属性设置为值
<local:Bar PropTest="test"></local:Bar>
在此示例中,当显示usercontrol时,文本显示为null,就像从未设置PropTest属性一样。我错过了一些明显的东西吗?提前谢谢。
答案 0 :(得分:0)
当用作属性时,PropTest在调用构造函数后设置,因此在将属性应用于文本框时不会设置它。
您最好将事件附加到属性更改,或使用TextBox作为属性的后备值。
答案 1 :(得分:0)
这是因为属性的值永远不会在txtExpected-Control的Text-Property上设置。在调用构造函数时,属性PropTest仍然为null。
因此,您必须更改属性的实现:
public string PropTest
{
get { return txtExpected.Text; }
set { txtExptected.Text = value; }
}
答案 2 :(得分:0)
您应该使用DependencyProperties,因此您可以通过xaml
绑定控件属性在您的班级声明中:
public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
"MyProperty", //Property name
typeof(string), //Property type
typeof(MyControl), //Type of the dependency property provider
new PropertyMetadata(MyPropertyChanged));//Callback invoked on property value has changes
public string MyProperty
{
set
{
this.SetValue(MyProperty, value);
}
get
{
return (string)this.GetValue(MyProperty);
}
}
private static void MyPropertyChanged( object sender, DependencyPropertyChangedEventArgs args )
{
// update your control inner elements properties
}
由于拼写错误而编辑了几次:P
答案 3 :(得分:-1)
当您添加Text
属性时会发生什么:
<TextBlock x:Name="txtExpected" Text="{Binding PropTest}" />
并删除该行
txtExpected.Text = PropTest;
来自构造函数?
答案 4 :(得分:-1)
将PropTest属性中的值赋值委托给TextBox:
public string PropTest
{
get { return txtExpected.Text; }
set { txtExpected.Text = value; }
}
答案 5 :(得分:-1)
您似乎没有在PropTest的setter中执行任何操作。它不会在构造之前设置,所以当你这样做时它将为null:
txtExpected.Text = PropTest;
在构造函数中。如果你这样做:
public string PropTest
{
get { return _PropTest; }
set
{
_PropTest = value;
txtExpected.Text = PropTest;
}
}
它应该工作。这不是我称之为“理想”的做事方式,你可能想看看Dependency Properties,INotifyPropertyChanged和Binding。