【问题标题】:How to implement a code behind function using View Model?如何使用 View Model 实现代码隐藏功能?
【发布时间】:2015-02-22 07:19:42
【问题描述】:

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

这就是我所拥有的。

然后:

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

<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()??

【问题讨论】:

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


    【解决方案1】:

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

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

    你可以在EventTriggerBehavior上使用CallMethodAction调用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
    }
    

    【讨论】:

    • 我用过一次 Behaviors SDK。有没有其他方法(纯代码)(可能是使用命令)可以实现这一点? @Sridhar
    • 所以,在 spnl_tapped 内部,在 1) 获取视图模型 2) 执行命令之后,我应该编写功能。正确的? @Sridhar
    • 该命令将调用您在视图模型中定义的异步方法。你可以在那里写你的功能。因此,您无需在代码隐藏方法中包含更多功能。
    • 好的。那太棒了。但是委托给 spnl_tapped viewmodel 方法会产生错误。说 Tapped 是一个“属性”,但用作“类型”。我是这个 C# 世界的新手。 @Sridhar
    • 我已经编辑了帖子以包含整个视图模型的代码。它应该工作。错误可能是因为Tapped 是一个事件名称,而我已经更改了命令名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2020-08-19
    • 2020-02-27
    • 1970-01-01
    • 2011-01-19
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多