我有一个简单的依赖属性。我有一个带有按钮的用户控件。我希望调用者将一个名为 MyName 的属性设置为“Hello”。我希望依赖属性代码将字符串“World”附加到末尾。这是我尝试这样做的代码:
#region MyNAME DEPENDENCY PROPERTY
private string _myName;
public string MyName
{
get { return this._myName; } //a breakpoint here never trips
set
{
this._myName = value;
this.OnPropertyChanged("MyName");
}
}
public string MyName2 { get { return this._myName; } } //a breakpoint here will trip
public static readonly DependencyProperty MyNameProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyTabControl), new PropertyMetadata("", OnMyNamePropertyChanged));
private static void OnMyNamePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
MyTabControl myUserControl = dependencyObject as MyTabControl;
myUserControl.OnMyNamePropertyChanged(e);
myUserControl.OnPropertyChanged("MyName");
}
private void OnMyNamePropertyChanged(DependencyPropertyChangedEventArgs e)
{
this.MyName = (string)e.NewValue + " World";
}
#endregion //end MyNAME
我的按钮 XAML 代码如下所示:
<Button Content="{Binding Path=MyName, Mode=OneWay}" />
当我加载具有此控件的页面时,如下所示:
<local:MyTabControl MyName="Hello" />
我得到一个显示“Hello”的按钮,而不是显示“Hello World”的按钮。奇怪的是,如果我将按钮 XAML 代码更改为使用 MyName2,如下所示:
<Button Content="{Binding Path=MyName2, Mode=OneWay}" />
有用。getter 代码是相同的(我在上面包含了它)。我猜得到 _myName 的代码比我预期的更早被调用。我也没想到的是 MyName getter 似乎永远不会被调用。当我在那里设置断点时,它不会跳闸。但是,当我将按钮绑定路径更改为使用 MyName2 时,放置在该 getter 上的断点将会跳闸。
我在这里做错了什么?如何使用 MyName 属性并让我的按钮显示“Hello World”(当然不使用第二个 getter)
编辑:添加新代码。
我接受了您的两个建议,并将我的 C# 代码更改为:
public string MyName
{
get { return (string)GetValue(MyNameCustomProperty); }
set { SetValue(MyNameCustomProperty, value + " World"); }
}
public static DependencyProperty MyNameCustomProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyTabControl));
(我仍然是依赖属性的新手)我仍然遇到与以前的代码相同的问题。我可以用这段代码做点什么吗?