2

有没有办法在每次击键后更新文本绑定?

我的 WPF 自定义 TextBox 使用 KeyUp 事件

private void MyTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    BindingExpression BE = GetBindingExpression(TextBox.TextProperty);
    if (BE != null)
        BE.UpdateSource();
}

但在Windows 8/RT/StoreBindingExpression中不存在。

4

5 回答 5

5

我知道这个问题有点老了,但是我今天遇到了这个问题并找到了一个非常简单的解决方案。也许它可以帮助某人:

<TextBox Text="{Binding BindingSource, UpdateSourceTrigger=PropertyChanged}"/>

将 UpdateSourceTrigger-Property 设置为“PropertyChanged”时,每次文本更改时都会调用 UpdateSource()-方法(即使焦点没有丢失)。

于 2014-03-24T19:30:50.170 回答
1

那么,您确定文本已正确绑定吗?确保您绑定到的对象继承了 INotifyPropertyChanged 接口,并且您正在调用 NotifyProperty() 事件的公共字符串属性。

因此,如果您已正确绑定所有内容,您只需设置 TextBox 文本,XAML 将自动更新该值。

这是关于数据绑定的教程:http: //msdn.microsoft.com/en-us/library/ms752347.aspx

于 2012-08-31T15:20:05.677 回答
1

您应该使用TextChanged而不是KeyUpKeyDown

如何使用 C# 在 WinRT 中立即更新 TextBox 的源

于 2013-09-16T17:52:28.703 回答
1

有办法使用附加属性来解决您的问题。检查如何使 TextBox.Text 工作文章。

于 2013-10-02T08:12:23.767 回答
0

我可以向您建议一种完成此任务的方法,这在Silverlight的其他版本(WPF 和primis 中的 Windows Phone )上会更容易......

如您所见,BindingExpression没有Windows RT/Store 应用程序!...

实现此代码,与您的MVVM 模式兼容...

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace YourProject
{
    public static class TextBoxEx
    {
        public static string GetRealTimeText(TextBox obj)
        {
            return (string)obj.GetValue(RealTimeTextProperty);
        }

        public static void SetRealTimeText(TextBox obj, string value)
        {
            obj.SetValue(RealTimeTextProperty, value);
        }

        public static readonly DependencyProperty RealTimeTextProperty = DependencyProperty.RegisterAttached("RealTimeText", typeof(string), typeof(TextBoxEx), null);

        public static bool GetIsAutoUpdate(TextBox obj)
        {
            return (bool)obj.GetValue(IsAutoUpdateProperty);
        }

        public static void SetIsAutoUpdate(TextBox obj, bool value)
        {
            obj.SetValue(IsAutoUpdateProperty, value);
        }

        public static readonly DependencyProperty IsAutoUpdateProperty =
            DependencyProperty.RegisterAttached("IsAutoUpdate", typeof(bool), typeof(TextBoxEx), new PropertyMetadata(false, OnIsAutoUpdateChanged));

        private static void OnIsAutoUpdateChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var textbox = (TextBox)sender;

            if ((bool)e.NewValue)
                textbox.TextChanged += textbox_TextChanged;
            else
                textbox.TextChanged -= textbox_TextChanged;
        }

        private static void textbox_TextChanged(object sender, TextChangedEventArgs e)
        {
            var textbox = (TextBox)sender;

            textbox.SetValue(TextBoxEx.RealTimeTextProperty, textbox.Text);
        }
    }
}

...然后只需在您的 XAML 中使用它,并带有一个小技巧(双重绑定),如下所示...

1)声明新的“实用程序”类:

<common:LayoutAwarePage x:Name="pageRoot"
    x:Class="YourProject.YourPage"
    DataContext="{Binding Path=DefaultViewModel, RelativeSource={RelativeSource Self}}"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="YourProject"
    ...
    xmlns:extra="using:YourProject.YourNameSpace"
    mc:Ignorable="d">

2)在您的控件中实施:

<TextBox extra:TextBoxEx.IsAutoUpdate="True"
         extra:TextBoxEx.RealTimeText="{Binding Path=YourTextProperty, Mode=TwoWay}">
    <TextBox.Text>
        <Binding Path="YourTextProperty"
                 Mode="OneWay" />
    </TextBox.Text>
</TextBox>

这对我来说很好,我希望可以帮助你!

于 2013-09-16T09:09:55.003 回答