2013-07-17 22 views
6

izleyen bir resim olarak bir WPF kanvasının kaydedilmesi Bir tuvalim var, ör. this solution veya diğer birçok ItemsControl kullanarak benzer.MVVM Kalıbı

Şimdi bir ICommand'a bağlı olması gereken bir düğme istiyorum. Bu komut, görüntüyü kaydedebilen ViewModel sınıfının bir yöntemini çağırmalıdır. Kaydetme yöntemi açık, ancak MVVM desenini takip eden bağlamayı nasıl yaparım?

+0

olurdu? (MVVM ışık Röle Kumandası) – whoisthis

cevap

8

<Button Content="Save" 
     Command="{Binding SaveCanvasCommand}" 
     CommandParameter="{Binding ElenementName=myCanvas}" ?> 

<Canvas x:Name="myCanvas"> 
    <!-- Stuff to save --> 
</Canvas> 
Ve bir yerlerde sende ViewModel veya Command Eğer MVVM kullanarak bağlamak nasıl arıyorsunuz

void SaveCanvasCommandExecute(object parameter) 
{ 
    UIElement toSave = (UIElement)parameter; 
    //.. You'd probably use RenderTargetBitmap here to save toSave. 
} 
1

Eğer ekli bir davranış kullanabilirsiniz sizin ViewModel UI öğeleri başvurmak istemiyorsanız: Sonra

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) 
     { 
      // Save code..... 
     } 
    } 
} 

yılında senin ViewModel ayrıca ViewModel üzerinde bir özelliğini ayarlar sizin Command vardır:

public ICommand SaveCanvasCommand 
    { 
     get 
     { 
      if (_saveCanvasCommand == null) 
       _saveCanvasCommand = new RelayCommand(() => { IsSaveCanvas = true; }); 

      return _saveCanvasCommand; 
     } 
    } 

Ve Görünüm bağlıdır özelliği:

public bool IsSaveCanvas 
    { 
     get { return _isSaveCanvas; } 
     set 
     { 
      _isSaveCanvas = value; 
      RaisePropertyChanged("IsSaveCanvas"); 
     } 
    } 

Th Xaml hepsini bağlamak şöyle görünür tr: sizin Button/MenuItem bağlamak ardından

<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> 

Ve:

Ekteki davranış için ViewModel özelliğinin değerini bağlayan Control üzerinde Trigger ekle ViewModels Kaydet Komut: bir CommandParameter kullanarak ViewModel kayıt yöntemi, Tuval geçebileceği

<Canvas.ContextMenu> 
     <MenuItem Header="Save" Command="{Binding SaveCanvasCommand}"/> 
    </Canvas.ContextMenu>