WPF / C# - 内容绑定正在工作,现在还没有

时间:2017-09-14 14:35:58

标签: c# wpf

编辑:此代码是使用以下建议的更新版本,但仍然导致相同的问题。链接到问题图像,[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>

昨天我在工作日结束时试图解决这个问题,似乎无法找到我的打嗝。希望我提供了足够的数据但是你需要更多的问题!谢谢!

2 个答案:

答案 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;
        }
    }
}