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. Единственное, что фокусируется, делает в отношении фрагмента кода, который вы сделали, это предотвращение доступа с клавиатуры.