编辑:此代码是使用以下建议的更新版本,但仍然导致相同的问题。链接到问题图像,[EXAMPLE IMAGE]。
此代码旨在更新" AddUserNewUsername"用于为我的小程序创建新用户帐户的tabitem上的标签。一旦用户离开"名字"它就会用来更新标签。和"姓氏"领域。但是,经过一些测试后,它看起来像" AddUserNewUsername"字符串IS正在填充,但不会在GUI上从空白处更新。
我真的很困惑。我对绑定很陌生,但我真的不明白这是怎么回事。我唯一改变的是来自" NewUsername"的变量。到" AddUserNewUsername"并随之更新所有内容。以下是相关代码的片段。
MainWindow XAML:
<Label Name="add_user_uname" Grid.Column="5" Grid.ColumnSpan="6" Grid.Row="7"
Content="{Binding Path=AddUserNewUsername, Mode=OneWay}"
Style="{DynamicResource add_user_label_uname}"/>
<TextBox Name="add_user_finame" Grid.Column="5" Grid.ColumnSpan="6" Grid.Row="2"
Text="{Binding Path=AddUserFirstName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
Style="{DynamicResource add_user_text_box_std}"/>
<TextBox Name="add_user_lname" Grid.Column="5" Grid.ColumnSpan="6" Grid.Row="3"
Text="{Binding Path=AddUserLastName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
Style="{DynamicResource add_user_text_box_std}"/>
MainWindow Code Behind:
public MainWindow()
{
InitializeComponent();
this.DataContext = id;
}
public Instance_Data id = new Instance_Data();
User_Management类(只是为了显示消息框的来源。):
public static void AttemptUserCreation(MainWindow parent, string finame, string lname, string email, string pword, string verify_pword, string uname, string current_user)
{
MessageBox.Show(parent.id.AddUserNewUsername);
return;
Instance_Data类:
public class Instance_Data : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string _addUserFirstName;
private string _addUserLastName;
public string AddUserFirstName
{
get { return _addUserFirstName; }
set
{
_addUserFirstName = value;
OnPropertyChanged("AddUserFirstName");
OnPropertyChanged("AddUserNewUsername");
}
}
public string AddUserLastName
{
get { return _addUserLastName; }
set
{
_addUserLastName = value;
OnPropertyChanged("AddUserLastName");
OnPropertyChanged("AddUserNewUsername");
}
}
public string AddUserNewUsername
{
get
{
if (!String.IsNullOrEmpty(AddUserFirstName))
{
return AddUserFirstName[0] + AddUserLastName;
}
else
{
return AddUserFirstName;
}
}
}
add_user_label_uname请求样式:
<Style x:Key="add_user_label_uname" TargetType="{x:Type Label}">
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="FontFamily" Value="Tahoma"/>
<Setter Property="FontSize" Value="10"/>
<Setter Property="Foreground" Value="#B45A00"/>
</Style>
昨天我在工作日结束时试图解决这个问题,似乎无法找到我的打嗝。希望我提供了足够的数据但是你需要更多的问题!谢谢!
答案 0 :(得分:3)
经过多次探索,我们发现C#代码中看似无关紧要的一行正在清除Binding
上的Label
:
parent.add_user_uname.Content = "";
使用set
访问者设置dependency property时,设置本地值。该值将清除已应用于同一属性的任何OneWay
绑定。
通常,如果您要绑定某种视图模型或数据模型,您应该坚持操纵模型而不是绑定它的视图。遵循这种方法可以节省数小时的沮丧调试。在好的方面,你不会再犯这个错误:)。
依赖属性有许多细微之处。设置本地值不仅会完全替换以前的值(包括单向,源到目标绑定),而且它还会覆盖由setter和trigger提供的值。这些微妙之处总会给新的WPF开发人员带来一些困惑。如果您想在WPF开发中取得成功,您应该深入了解详细的MSDN文档。我还推荐Adam Nathan出色的书 WPF 4.5 Unleashed 。与此主题最相关的第3章过去是免费在线提供的,它仍然可能是。
正如@Iqon指出的那样,您的NullReferenceException
访问者中也有潜在的AddUserNewUsername
答案 1 :(得分:0)
我看到的唯一可能的打破方法是AddUserNewUsername
的吸气。
如果AddUserFirstName
为空,您将获得NullReferenceException
,因为您只检查该字符串是否为空。
将吸气剂更改为:
public string AddUserNewUsername
{
get
{
if (!String.IsNullOrEmpty(AddUserFirstName))
{
return AddUserFirstName[0] + AddUserLastName;
}
else
{
return AddUserFirstName;
}
}
}