如何使用View Model实现代码隐藏功能?

时间:2014-12-24 06:15:57

标签: c# mvvm windows-phone-8.1 mvvm-light

仅供参考,我在S.O中发现了一个类似的question,但它的答案附有一个断开的链接。它没有帮助我。

这就是我所拥有的。

然后:

我的视图中有一个StackPanel。使用代码隐藏,在它的tap事件中,我编写了一个执行特定任务的函数。

<StackPanel x:Name="spnl" Tapped="spnl_Tapped" >
   <Grid>
      <Grid.RowDefinitions>
          <RowDefinition Height="*"/>
          <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
     <Image  Source="{Binding imgImage}"/>
     <TextBlock Grid.Row="1" Text="{Binding Title}"/>
  </Grid>
</StackPanel>

现在:

我的视图中有一个StackPanel。我在ViewModel中编写了一个类。

 public class ClassIWroteinViewModel: ViewModelBase
    {   
        public ImageSource imgImage { get; set; }
        public string Title { get; set; }      
        private async void spnl_Tapped()
        {
           IReadOnlyList<IStorageItem> PicturesLibrary = await KnownFolders.PicturesLibrary.GetFoldersAsync();                
        }
    }

我的问题是如何实现这个spnl_Tapped()??

2 个答案:

答案 0 :(得分:1)

在触发事件时,您应该考虑使用行为SDK 来调用方法。添加对Behaviors SDK的引用(来自扩展),然后将这些引用添加到XAML页面。

xmlns:Interactions="using:Microsoft.Xaml.Interactions"
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"

您可以使用CallMethodAction

上的EventTriggerBehavior来调用viewmodel方法
<StackPanel>
  <Grid>
     <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="Auto"/>
  </Grid.RowDefinitions>
 <Image  Source="{Binding imgImage}"/>
 <TextBlock Grid.Row="1" Text="{Binding Title}"/>
 </Grid>
     <Interactivity:Interaction.Behaviors>
         <Core:EventTriggerBehavior EventName="Tapped">
                <Core:CallMethodAction MethodName="spnl_tapped"/>
            </Core:EventTriggerBehavior>
        </Interactivity:Interaction.Behaviors>
</StackPanel>

编辑:还有另一种方法。在视图模型中有一个指向spnl_tapped的委托的命令。

public class ClassIWroteInViewModel:ViewModelBase{

       public RelayCommand TapCommand
       {
             get;
             private set;
       }

       public ClassIWroteInViewModel()
       {
             TapCommand=new RelayCommand(spnl_Tapped);//delegate to spnl_tapped viewmodel method
       }

       public ImageSource imgImage { get; set; }
       public string Title { get; set; }      

       private async void spnl_Tapped()
      {
             IReadOnlyList<IStorageItem> PicturesLibrary = await KnownFolders.PicturesLibrary.GetFoldersAsync();                
      }

 }

现在在代码隐藏..

private void spnl_Tapped(object sender, TappedRoutedEventArgs e)
{
     var vm=this.DataContext as ClassIWroteInViewModel; //get the view model
     vm.TapCommand.Execute(null);//execute the command
}

答案 1 :(得分:0)

由于您将此问题标记为“mvvm-light”,我假设您使用的是mvvmlight。你可以访问这篇文章:

http://blog.galasoft.ch/posts/2014/01/using-the-eventargsconverter-in-mvvm-light-and-why-is-there-no-eventtocommand-in-the-windows-8-1-version/