WPF:文本框的文本没有更新(WPF: TextBox Text is not updating)

2019-09-02 12:42发布

我有我使用的是内部的用户控件DataTemplate ,这个UserControl包含一个TextBox ,其绑定与Value属性(声明为一个DependencyProperty我的) UserControl 。 在数据模板,我这个Value属性绑定我的实际财产说名称 (也DependencyProperty )。 它正常工作,我分配一个值,同时加载和我对Name属性TextBox显示它,我改变值从TextBox ,同时也更新我的名称属性。 现在问题来了,而我添加PropertyChangedEventHandler在依赖属性,我检查的值,如果它是有效的,如果有效什么也不做,如果没有有效的分配旧值。 在值无效的,当我给它分配旧的价值,性能更新,但它不是在我的显示更新值情况下, TextBoxUserControl 。 谁能告诉我为什么?

我的XAML UserControl

<UserControl x:Name="usercontrol">
   <StackPanel>
      <TextBlock ......./>
      <TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
   </StackPanel>
</UserControl>

在后面的代码是一个DependencyProperty

我在我使用这个DataTemplate

<HierarchicalDataTemplate DataType="{x:Type myLib:myClass}" ItemsSource="{Binding Children}">
    <Expander Header="{Binding}">
        <WrapPanel>
            <edproperty:TextPropertyEditor Caption="Name" Value="{Binding Name, Mode=TwoWay}"/>
            <edproperty:TextPropertyEditor .................../>
            <edproperty:TextPropertyEditor .................../>
            <edproperty:TextPropertyEditor ...................../>
        </WrapPanel>
    </Expander>
</HierarchicalDataTemplate>

这个模板我正在使用一个TreeView 。 里面TreeView我在输入值TextBox哪些更新我的Value属性UserControl ,在之交更新Name属性myClass我分配PropertyChangedCallback我的名称属性在myClass ,执行一些验证和重新分配OldValue如果验证失败。 这反过来又更新Value属性还可以,但我仍然看到该TextBox有我较早进入而非更新的相同的值。

public string Name
    {
        get
        {
            return (string)GetValue(NameProperty);
        }
        set
        {
            SetValue(NameProperty, value);
        }
    }

    // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty NameProperty =
        DependencyProperty.Register("Name", typeof(string), typeof(myClass), new UIPropertyMetadata(null, OnNameChanged));

    protected static void OnNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        if(checkRequired && !IsValid(e.NewValue.ToString()))
        {
            checkRequired=false;
            (sender as myClass).Name = args.OldValue.ToString();
        }
    }

    private static bool IsValid(string name)
    {
         .............some logic here
    }

Answer 1:

之后环视天,大量的搜索,我发现我的问题的解决方案

所有验证完成,旧的分配值和更新的关系是不属性后,我需要CAL UpdateTarget()方法,以更新我的文本框中的值。

这就是解释了更好的解决方案

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/



Answer 2:

我知道这个问题是关于文本框但RichTextBox中你可以使用UpdateLayout请()。

rtb.AppendText("Text");
rtb.ScrollToEnd();
rtb.UpdateLayout();


Answer 3:

它看起来像你破坏了绑定时你直接从代码中设置属性值的后面。

你不应该修改属性的方式。 使用值强制机制 ,并在强制值回调验证输入。



Answer 4:

阿努拉格,

有很多假设,我要在这里做的,但我给它一个镜头。

你可能有这样的事情?

// ...
public static string GetValue(Dependency obj)
{
   // ...
}

// ...
public static void SetValue(DependencyObject obj, string value)
{
    // ...
}

// Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ValueProperty =
    DependencyProperty.RegisterAttached("Value", typeof(string), typeof(MyCustomControl), new UIPropertyMetadata(OnValuePropertyChanged));

public static void OnValuePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    string newValue = e.NewValue as string;

    // You validate your value here,
    // Then if fails, revert to old value.
    if(!SomeCondtion(newValue)) SetValue(obj,e.OldValue as string);

}

这绝对不是验证数据的最佳方式。 有迹象表明,会给你更多的灵活性其他更有效的方法。

  1. 您TexBox应用有效性规则。 这是我的第一个建议,因为它会给你在验证失败时显示错误控制。 如果你是一个简单的验证之后,看看我的文章 。
  2. 监听TextBox.TextChanged事件。 这是繁琐的,不重复使用最多砍死。
  3. 不要使用DependecyPropertyChanged回调方法。 使用已注册的string属性和您的二传手,应用逻辑,如

     public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(UserControlWithTextBox)); private string _oldValue; public string Value { get { return GetValue(ValueProperty) as string; } set { // Check if the value passes your validation logic if(SomeCondtion(value)) { // If yes, then set the value, and record down the old value. SetValue(ValueProperty, value); _oldValue = value; } else { // Else logic fails, set the value to old value. SetValue(ValueProperty, _oldValue); } // Implement INotifyPropertyChanged to update the TextBox. if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); } } 

再次,你可以从我的回答看,您仍然可以显示你的问题代码,以帮助别人回答你的问题,无论您的解决方案可能多么复杂(如果你想有一个很好的答案,你需要投入精力问一个很好的问题)。 我的回答可能不适合你的工作,但也许它可能给你一些“谷歌搜索”的方向。 希望能帮助到你。



文章来源: WPF: TextBox Text is not updating