Я пытаюсь привязать свойство IsInInputMode
моего ViewModel к свойству зависимости в UserControl.Я устанавливаю DataContext UserControl для экземпляра моей ViewModel, и все мои привязки на основе XAML работают правильно.Мне нужно решение кода для создания этой привязки.Я попробовал несколько вещей (в нижней части поста), которые не работали.
Я не получаю никаких исключений, регистрируемых в окне «Вывод», и это то место, где мне сказали искатьдля привязки на основе исключений.
Я задал этот похожий вопрос о привязке свойства зависимости в UserControl через XAML - мне сказали, что это невозможно, поэтому я ищурешение с выделением кода.
ViewModel выглядит следующим образом:
class AddClientViewModel : ViewModelBase
{
private Boolean _isInInputMode;
public Boolean IsInInputMode
{
get { return _isInInputMode; }
set
{
_isInInputMode = value;
OnPropertyChanged("IsInInputMode");
}
}
public ICommand Cancel
{
get { return new RelayCommand(parm => { IsInInputMode = false; }); }
}
}
Команда Cancel
успешно привязывает данные к команде кнопки через XAML.
Свойство Dependency в UserControl выглядит следующим образом:
public bool IsInInputMode
{
get { return (bool)GetValue(IsInInputModeProperty); }
set { SetValue(IsInInputModeProperty, value); }
}
public static readonly DependencyProperty IsInInputModeProperty =
DependencyProperty.Register("IsInInputMode", typeof(bool), typeof(AddClientView), new UIPropertyMetadata(new PropertyChangedCallback(_OnIsInInputModePropertyChanged)));
private static void _OnIsInInputModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var mycontrol = d as AddClientView;
bool oldValue = (bool)e.OldValue;
bool newValue = (bool)e.NewValue;
if (null != mycontrol && oldValue != newValue)
{
mycontrol._OnIsInInputModeChanged(oldValue, newValue);
}
}
private void _OnIsInInputModeChanged(bool oldValue, bool newValue)
{
if (newValue)
{
VisualStateManager.GoToState(this, "InputState", false);
}
else
{
VisualStateManager.GoToState(this, "HiddenState", false);
}
}
Привязка в конструкторе моего UserControl прошла несколько итераций.
Первая попытка:
public AddClientView()
{
InitializeComponent();
SetBinding(IsInInputModeProperty, "IsInInputMode");
}
Вторая попытка:
public AddClientView()
{
InitializeComponent();
var b = new Binding();
b.Source = this.DataContext;
b.Path = new PropertyPath("IsInInputMode");
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(this, IsInInputModeProperty, b);
}
Ни одна из этих «неудач» сошибка компилятора или времени выполнения;но когда свойство IsInInputMode изменяется в ViewModel, свойство Dependency никогда не обновляется, а два четных обработчика там никогда не вызываются.
В качестве дополнительного примечания ViewModel имеет несколько ICommand
свойств, которые успешно связаны с кнопками в UserControl через XAML - поэтому я правильно знаю привязку DataContext.