Здравствуйте, MxMsk, Вы писали:
MM>Эти грабли стары как мир!
Да, точно. Назвать это граблями, а не багом будет правильнее, т.к. на уровне самой технологии трудно сказать как должно это дело отрабатывать, ведь это специфика конкретного гуя, его вьюх и моделей. Другое дело, что это создает неудобства.
BB>>Что думаете, какие решения есть?
MM>1) Делать копию объекта для редактирования в режиме PropertyChanged. Менять объект при принятии изменений пользователем.
MM>2) При нажатии кнопки, вызывать UpdateSource всех биндингов с LostFocus.
Я предложил другой вариант он там идет под заголовком "What you think about proxy command and KeyBinding to ENTER key?", но ТС предпочел другое решение и +300 к карме ушло не мне
Хотя я в будущем в такой ситуации предпочту свое решение, оно мне кажется лучше ... но там видно будет
PS Собственно что я предложил:
Использовать специальную прокси команду:
<Window.Resources>
<model:ButtonProxyCommand x:Key="proxyCommand"/>
</Window.Resources>
<Window.InputBindings>
<KeyBinding Key="Enter"
Command="{Binding Source={StaticResource proxyCommand}, Path=Instance}"
CommandParameter="{Binding ElementName=_okBtn}"/>
</Window.InputBindings>
<StackPanel>
<TextBox>
<TextBox.Text>
<Binding Path="Text"></Binding>
</TextBox.Text>
</TextBox>
<Button Name="_okBtn" Command="{Binding Command}">Ok</Button>
</StackPanel>
Сама команда:
public class ButtonProxyCommand : ICommand
{
public bool CanExecute(object parameter)
{
var btn = parameter as ButtonBase;
if (btn == null || btn.Command == null)
return false;
return btn.Command.CanExecute(btn.CommandParameter);
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (parameter == null)
return;
var btn = parameter as ButtonBase;
if (btn == null || btn.Command == null)
return;
Action a = () => btn.Focus();
var op = Dispatcher.CurrentDispatcher.BeginInvoke(a);
op.Wait();
btn.Command.Execute(btn.CommandParameter);
}
private static ButtonProxyCommand _instance = null;
public static ButtonProxyCommand Instance
{
get
{
if (_instance == null)
_instance = new ButtonProxyCommand();
return _instance;
}
}
}