Привязка TextBox к обработанной строке - PullRequest
1 голос
/ 06 января 2012

У меня проблема с привязкой текстового поля «Текст».вот код:

<TextBox Padding="2"
    AcceptsReturn="True"
    AcceptsTab="True"
    Name="txtCmd"
    Text="{Binding CommandText, 
                   Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

и вот свойство VM:

private string _CommandText;
public string CommandText
{
    get
    {
        return this._CommandText;
    }
    set
    {
        if(!(value == this._CommandText))
        {
            this._CommandText = value;
            if (this._CommandText.IndexOf("\r\n") > -1)
            {
                ParseCommand(this._CommandText)
                this._CommandText = "";
            }
            base.OnPropertyChanged("CommandText");
        }
    }
}

Проблема в том, что: когда я нажимаю клавишу ввода в текстовом поле, ParseCommand вызывает и делает все, что нужно,Кроме того, _CommandText будет установлен в (""), но это не влияет на значение textbox.text, я имею в виду, что в следующий раз, когда нажата клавиша enter, в _CommandText все еще есть некоторые символы \ r \ n!

я что-то не так делаю?любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Я думаю, вам лучше справиться с этим иначе.На самом деле вам не нужно связывать текст, так как вы не хотите синхронизировать данные, но обрабатываете ввод, поэтому лучше использовать входные события.

Это может сочетаться с командованием и Blend SDK. Interactivity, например,

<TextBox Padding="2">
    <i:Interaction.Triggers>
        <t:KeyDownTrigger Key="Return">
            <i:InvokeCommandAction Command="{Binding ProcessCommandCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TextBox}}" />
        </t:KeyDownTrigger>
    </i:Interaction.Triggers>
</TextBox>

Где KeyDownTrigger определен так:

public class KeyDownTrigger : TriggerBase<TextBox>
{
    public Key Key { get; set; }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(AssociatedObject_PreviewKeyDown);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewKeyDown -= AssociatedObject_PreviewKeyDown;
    }

    void AssociatedObject_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == Key)
        {
            InvokeActions(null);
        }
    }
}

И команда будет выглядеть примерно так:

private readonly Command _ProcessCommandCommand = new Command(p =>
    {
        var tb = (TextBox)p;
        var command = tb.Text;
        // <Process command>
        tb.Clear();
    });
public Command ProcessCommandCommand { get { return _ProcessCommandCommand; } }

(Command - это то, что люди любят называть RelayCommand, общая реализация ICommand, использующая функции, переданные в конструкторе)

0 голосов
/ 06 января 2012

Я не знаю точную причину такого поведения TextBox, но для решения вашей проблемы установите _CommandText = null вместо "".Вот пример кода.

private string _CommandText;
public string CommandText
{
    get
    {
        return this._CommandText;
    }
    set
    {
        if(!(value == this._CommandText))
        {
            this._CommandText = value;
            if (this._CommandText.Contains("\r\n"))
            {
                ParseCommand(this._CommandText)
                this._CommandText = null;
            }
            base.OnPropertyChanged("CommandText");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...