2014-07-20 11 views
7

के पीछे कोड से अपने व्यूमोडेल तक कैसे पहुंच सकता हूं, मुझे समझ में नहीं आता कि मैं एमवीवीएम क्लिक करने योग्य आयत बनाने के लिए कमांड कैसे बना सकता हूं। यहां मेरा कोड है:मैं

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

मेरे पहले आयत पर आप देख सकते हैं कि मैंने ईवेंट के पीछे एक कोड बनाया है। सबसे पहले मुझे नहीं पता कि कोड के पीछे से मेरे ViewModel तक कैसे पहुंचे। दो यह वास्तव में एमवीवीएम नहीं है।

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

मैं बस जब कोई मेरे आयत पर क्लिक करें मेरी ViewModel में संग्रहीत एक सूची में संग्रहीत एक सरल बूलियन मान बदलने में सक्षम होने की जरूरत है। एमवीवीएम के साथ इतना जटिल क्यों है?

+0

'वर रेक्ट = Rectangle' के रूप में इस और उसके बाद जो कुछ भी आप, यह करना चाहते हैं, हालांकि यह बहुत बुरा डिजाइन है और आप _should_ द्वारा हर तरह के डेटा का उपयोग बंधन और नहीं बल्कि ऐसा करने की तुलना में एक क्षेत्र के लिए रंग के लिए बाध्य करते हैं। उनसे लड़ने के बजाय दिए गए अवशेषों को जानें और उनका उपयोग करें। –

+0

और मुझे आयताकार मिल गया ... तो अगला क्या है? प्रेषक प्राप्त करना समस्या नहीं है। उसके बाद मुझे अपने दृश्य मॉडल में संग्रहीत सूची में संग्रहीत मेरे बूलियन मान को अपडेट करने की आवश्यकता है। –

उत्तर

7

यह बहुत मुश्किल नहीं है।

देखें XAML: पहले, अपने विंडो XAML के अंदर अपने ViewModel का एक उदाहरण बनाने 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> 

उसके बाद, आप System.Windows.Interactivity.InvokeCommandAction एक आदेश करने के लिए अपने घटना अनुवाद करने के लिए कर सकते हैं :

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

अब, आपके व्यूमोड में

ViewModel: एल, कि घटना के लिए बाध्य करने के लिए एक ICommand और DelegateCommand कार्यान्वयन की स्थापना

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

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

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

MVVM में आप के पीछे कोड से आपके विचार मॉडल तक पहुँचने नहीं किया जाना चाहिए, दृश्य मॉडल और देखें एक दूसरे के अनजान हैं यहां व्याख्यान समाप्त होता है :)

इसके बजाय आप EventToCommand व्यवहार को अपने नियंत्रण में संलग्न कर सकते हैं। यह आपको डेटा संदर्भ में नियंत्रण में किसी ईवेंट को नियंत्रण में बाध्य करने देता है। यहां msdn commands tutorial देखें।

यदि आप इसे करने के लिए बेताब हैं, तो आप नियंत्रण डेटा संदर्भ संपत्ति तक पहुंच सकते हैं और आंतरिक दृश्यों तक पहुंच प्रदान करने के लिए इसे अपने दृश्य मॉडल प्रकार में डाल सकते हैं।

var vm = (ViewModelType)this.DataContext; 
vm.CommandProperty.Execute(null);