2014-07-20 13 views
7

Tôi không hiểu cách tôi có thể tạo lệnh để tạo hình chữ nhật có thể nhấp MVVM. Đây là mã của tôi:Làm cách nào tôi có thể truy cập ViewModel của mình từ mã phía sau

<Rectangle x:Name="Color01" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Margin="10,29,0,0" Stroke="Black" VerticalAlignment="Top" Width="100" MouseDown="Color_MouseDown" /> 
<Rectangle x:Name="Color02" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Margin="115,29,0,0" Stroke="Black" VerticalAlignment="Top" Width="100"/> 
<Rectangle x:Name="Color03" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Margin="220,29,0,0" Stroke="Black" VerticalAlignment="Top" Width="100"/> 
<Rectangle x:Name="Color04" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Margin="325,29,0,0" Stroke="Black" VerticalAlignment="Top" Width="100"/> 

Trên hình chữ nhật đầu tiên của bạn, bạn có thể thấy tôi đã tạo mã đằng sau sự kiện. Trước tiên, tôi không biết cách truy cập ViewModel của mình từ mã phía sau. Hai nó không thực sự là MVVM.

public partial class MainWindow : Window 
{ 
    /// <summary> 
    /// Initializes a new instance of the MainWindow class. 
    /// </summary> 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Closing += (s, e) => ViewModelLocator.Cleanup(); 
    } 

    private void Color_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     // So what ??? 
    } 
} 

Tôi chỉ cần có thể thay đổi giá trị boolean đơn giản được lưu trữ trong danh sách được lưu trữ trong chế độ xem của tôiMô hình khi ai đó nhấp vào hình chữ nhật của tôi. Tại sao nó quá phức tạp để làm với MVVM?

+0

'var rect = sender làm Rectangle' và sau đó thực hiện bất kỳ điều gì bạn muốn, mặc dù thiết kế này rất tồi và bạn _should_ bằng cách sử dụng ràng buộc dữ liệu và liên kết màu với trường thay vì thực hiện việc này. Tìm hiểu và sử dụng các trừu tượng bạn được đưa ra thay vì chống lại chúng. –

+0

Và tôi nhận được hình chữ nhật ... sau đó những gì tiếp theo? Bắt người gửi không phải là vấn đề. Sau đó tôi cần cập nhật giá trị boolean của tôi được lưu trữ trong một danh sách được lưu trữ trong viewModel của tôi. –

Trả lời

7

Điều này không quá khó. Đầu tiên, tạo một thể hiện của ViewModel của bạn bên trong cửa sổ XAML của bạn:

Xem XAML:

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:VM="clr-namespace:MySolutiom.ViewModels"> 
    <Window.DataContext> 
     <VM:MainViewModel /> 
    </Window.DataContext> 
    </Window> 

Sau đó, bạn có thể System.Windows.Interactivity.InvokeCommandAction dịch sự kiện của bạn cho một lệnh:

Xem XAML :

<Grid> 
<Rectangle x:Name="Color01" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Margin="10,29,0,0" Stroke="Black" VerticalAlignment="Top" Width="100" MouseDown="Color_MouseDown">   <interactivity:Interaction.Triggers> 
     <interactivity:EventTrigger EventName="MouseDown"> 
      <interactivity:InvokeCommandAction Command="{Binding MyCommand}"/> 
     </interactivity:EventTrigger> 
    </interactivity:Interaction.Triggers> 
</Rectangle> 
</Grid> 

Bây giờ, trong ViewMod của bạn el, thiết lập một ICommandDelegateCommand thực hiện liên kết với sự kiện rằng:

ViewModel:

public class ViewModel 
{ 
    public ICommand MyCommand { get; set; } 

    public ViewModel() 
    { 
     MyCommand = new DelegateCommand(OnRectangleClicked); 
    } 

    public void OnRectangleClicked() 
    { 
     // Change boolean here 
    } 
} 
15

Trong MVVM bạn không nên truy cập vào mô hình điểm của bạn từ mã phía sau, mô hình xem và xem là không biết gì về nhau ở đây kết thúc bài giảng :)

Thay vào đó bạn có thể đính kèm hành vi EventToCommand vào điều khiển của mình. Điều này cho phép bạn liên kết một sự kiện trong điều khiển với một lệnh trong ngữ cảnh dữ liệu. Xem msdn commands tutorial tại đây.

Nếu bạn đang tuyệt vọng để làm điều đó, bạn có thể truy cập thuộc tính ngữ cảnh dữ liệu của điều khiển và đưa nó vào kiểu kiểu xem của bạn để cấp quyền truy cập vào nội bộ.

var vm = (ViewModelType)this.DataContext; 
vm.CommandProperty.Execute(null); 
Các vấn đề liên quan