My View Содержит Button
и UserControl
. UserControl
также содержит Button
. Оба, Button1 в моем представлении и Button2 в моем UserControl
должны вызвать тот же метод в ViewModel.вводят действие в UserControl
Поэтому мне нужно «впрыснуть» (не знаю, как назвать это) в RelayCommand
в UserControl
. Я думал, что будет легко с зависимыми свойствами, но я не могу заставить его работать.
Что я пробовал:
UserControl
содержит свойство зависимостей, которое установлено в XAML кодекса, содержащее UserControl
:
UserControl Код:
public const string LoadDataCommandPropertyName = "LoadDataCommand";
public Action LoadDataCommand
{
get
{
return (Action)GetValue(LoadDataCommandProperty);
}
set
{
SetValue(LoadDataCommandProperty, value);
}
}
public static readonly DependencyProperty LoadDataCommandProperty = DependencyProperty.Register(
LoadDataCommandPropertyName,
typeof(Action),
typeof(GridViewPersistenceController),
new UIPropertyMetadata());
Просмотр Xaml Код: (использование dp в UserControl)
<customControls:MyUserControl Grid.Column="1"
x:Name="RadGridViewSettingsPersistenceControl"
GridControl="{Binding ElementName=RadGridView}"
LoadDataCommand="{Binding ActionTest}"
/>
LoadDataCommand от UserControl обязан это свойство в ViewModel
private const string ActionTestPropertyName = "ActionTest";
private Action actionTest;
public Action ActionTest
{
get
{
return this.actionTest;
}
set
{
this.RaisePropertyChanging(ActionTestPropertyName);
this.actionTest = value;
this.RaisePropertyChanged(ActionTestPropertyName);
}
}
ActionTest свойство инициализируется в конструкторе ViewModel
public MyViewModel()
{
this.ActionTest = new Action(this.LoadData);
}
Окно вывода студии визуального также дало мне связывание ошибка (что я не понимаю)
System.Windows.Data Error: 40 : BindingExpression path error: 'ActionTest' property not found on 'object' ''MyUserControl' (Name='RadGridViewSettingsPersistenceControl')'. BindingExpression:Path=ActionTest; DataItem='MyUserControl' (Name='RadGridViewSettingsPersistenceControl'); target element is 'MyUserControl' (Name='RadGridViewSettingsPersistenceControl'); target property is 'LoadDataCommand' (type 'Action')
Я нашел обходное решение, которое работает, но мне оно не нравится. Я устанавливаю LoadDataCommand в LoadedEvent of View codebehind. Это выглядит беспорядочно для меня, и я чувствую, что пропустил некоторые важные понятия.
//TODO: Dirty coding, fix me
private void MyView_OnLoaded(object sender, RoutedEventArgs e)
{
this.RadGridViewSettingsPersistenceControl.LoadDataCommand = new Action((this.DataContext as MyViewModel).LoadData);
}
Вопросы:
- Как я прохожу
Command
/Action
определены в ViewModel в UserControl с использованием кода XAML в представлении? - Почему мой текущий подход с привязками не работает?
- Я пропустил некоторые фундаментальные понятия? (Может я это легче АРХИВ с делегатами (я пробовал ..)?)
Спасибо, это работает. Почему я должен предпочесть реализации ICommand (например, RelayCommand) над Action? – Joel
Предположим, вы хотите отключить свою кнопку при каком-либо условии. С помощью 'ICommand' вы можете просто написать свой код проверки в команде« CanExecute », но с помощью« Action »вы должны написать дополнительную логику. –
Сэр, вы заработали себе зеленый галочку. – Joel