If you do not want to reference user interface elements in the ViewModel, you can use the attached behavior:
internal static class Behaviours { public static readonly DependencyProperty SaveCanvasProperty = DependencyProperty.RegisterAttached("SaveCanvas", typeof(bool), typeof(Behaviours), new UIPropertyMetadata(false, OnSaveCanvas)); public static void SetSaveCanvas(DependencyObject obj, bool value) { obj.SetValue(SaveCanvasProperty, value); } public static bool GetSaveCanvas(DependencyObject obj) { return (bool)obj.GetValue(SaveCanvasProperty); } private static void OnSaveCanvas(DependencyObject obj, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) {
Then in your ViewModel, you have a command that sets the property, also on your ViewModel:
public ICommand SaveCanvasCommand { get { if (_saveCanvasCommand == null) _saveCanvasCommand = new RelayCommand(() => { IsSaveCanvas = true; }); return _saveCanvasCommand; } }
And the property tied to your view:
public bool IsSaveCanvas { get { return _isSaveCanvas; } set { _isSaveCanvas = value; RaisePropertyChanged("IsSaveCanvas"); } }
Then intercepting everything in Xaml is as follows:
Add a Trigger to Control , which binds the value of the ViewModel property to your nested behavior:
<UserControl.Style> <Style> <Style.Triggers> <DataTrigger Binding="{Binding IsSaveCanvas}" Value="True"> <Setter Property="wpfApplication1:Behaviours.SaveCanvas" Value="True"/> </DataTrigger> <DataTrigger Binding="{Binding IsSaveCanvas}" Value="False"> <Setter Property="wpfApplication1:Behaviours.SaveCanvas" Value="False"/> </DataTrigger> </Style.Triggers> </Style> </UserControl.Style>
And then bind your Button / MenuItem to the ViewModels save command:
<Canvas.ContextMenu> <MenuItem Header="Save" Command="{Binding SaveCanvasCommand}"/> </Canvas.ContextMenu>
source share