Wpf Caliburn Micro: средство получения TextBox не возвращает новое значение

У меня есть очень простой пример кода, TextBox и Button. Пользователь вводит некоторый текст в textBox и нажимает кнопку. Он должен показывать общий MessageBox, который содержит текст, который он только что ввел в TextBox.

Проблема: MessageBox показывает пустым! После некоторых проб и ошибок я выяснил причину. Я установил в.xaml Focusable of Button как false. Зачем? Потому что я хочу остановить эффект мигания кнопки после того, как она нажата один раз.

Итак, у меня есть идея. Я связываю Focusable со свойством в ViewModel и инициализирую в конструкторе (или в закрытом поле в качестве начального значения) ViewModel как false. Затем в обработчике события Button-Click перед показом MessageBox я устанавливаю свойство в true, а затем после выполнения MessageBox снова устанавливаем его в false. Проблема: к сожалению, это не работает! Кажется, что Focusable может быть установлен только один раз в конструкторе или в приватном поле в качестве начального значения.

Кто-нибудь знает, как решить эту проблему? Я хочу, чтобы для Focusable of the Button было установлено значение false (чтобы кнопка не мигала), и я хочу получить текст из TextBox, нажав кнопку. Ниже приведен пример кода и не стесняйтесь изменять и показывать мне решение. Заранее спасибо.

XAML / Просмотр

<Grid Width="300" Height="300">
    <StackPanel VerticalAlignment="Center">
        <TextBox Width="150" Text="{Binding Path=MyText}" />
        <Button x:Name="ShowText"
                Width="100"
                Content="Show Text"
                Focusable="{Binding Path=MyFocus}" />
    </StackPanel>
</Grid>

Посмотреть модель

public class ShellViewModel : PropertyChangedBase 
{
    private String _myText;
    public String MyText
    {
        get { return _myText; }
        set
        {
            _myText = value;
            NotifyOfPropertyChange(() => MyText);
        }
    }

    private Boolean _myFocus = false; // if it is true, the MessageBox can show MyText, otherwise MessageBox shows blank
    public Boolean MyFocus
    {
        get { return _myFocus; }
        set
        {
            _myFocus = value;
            NotifyOfPropertyChange(() => MyFocus);
        }
    }

    public void ShowText()
    {
        //MyFocus = true; // this doesn't work
        MessageBox.Show(MyText);
        //MyFocus = false; // this doesn't work
    }
}

1 ответ

Решение
<Grid Width="300" Height="300">
     <StackPanel VerticalAlignment="Center">
        <TextBox Width="150" Text="{Binding MyText, Mode=TwoWay}" />
         <Button x:Name="ShowText"
            Width="100"
            Content="Show Text"
            Focusable="{Binding MyFocus}" />
    </StackPanel> 
</Grid>

или же

<Grid Width="300" Height="300">
    <StackPanel VerticalAlignment="Center">
       <TextBox Width="150" x:Name="MyText" />
       <Button x:Name="ShowText"
            Width="100"
            Content="Show Text"
            Focusable="{Binding MyFocus}" />
    </StackPanel>
</Grid>

это должно работать в любом случае, то, как вы сделали привязку, никогда не обновит базовое свойство, поскольку оно не считается двунаправленным. Поэтому Mode=TwoWay был необходим в 1-ой версии, вторая версия использует соглашения CM для поиска текстового поля и привязки его к свойству с тем же именем в viewmodel.

не уверен, что мигает, если вы ссылаетесь на стиль по умолчанию, не мигает... по крайней мере, в Windows 8.1 или Windows 10. Единственное, что фокусируется, делает в отношении фрагмента кода, который вы сделали, это предотвращение доступа с клавиатуры.

Другие вопросы по тегам