GVKun编程网logo

windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?(windows event collector无法启动)

1

在本文中,我们将详细介绍windows-phone-8–WindowsPhone8.1–MVVMLight–为什么EventToCommad不工作?的各个方面,并为您提供关于windowseventc

在本文中,我们将详细介绍windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?的各个方面,并为您提供关于windows event collector无法启动的相关解答,同时,我们也将为您带来关于MVVM Light Toolkit(二、创建 MvvmLight 项目)、MVVM 框架 - MVVMLight、MVVMLight ViewModel文件夹丢失、mvvmlight 下 passwordBox 绑定的解决方法的有用知识。

本文目录一览:

windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?(windows event collector无法启动)

windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?(windows event collector无法启动)

我无法在 Windows Phone 8.1应用程序中使用EventToCommand.

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:galaSoft.MvvmLight.Command;assembly=galaSoft.MvvmLight.Extras.WP8"

我也尝试使用assembly = galaSoft.MvvmLight.Extras.WP81 …

<controls:PivotItem Name="pivotItem">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand Command="{Binding SelectServiceCommand}"
                            CommandParameter="{Binding Selectedindex,ElementName=pivotItem}"/>
    </i:EventTrigger>
    <!-- other stuff  -->
</i:Interaction.Triggers>

我得到以下错误:

>成员“触发器”无法识别或无法访问.
> XML命名空间’clr-namespace中的未知类型’EventTrigger’:System.Windows.Interactivity; assembly = System.Windows.Interactivity’
>错误2在“交互”类型中找不到可附加属性“触发器”.

有谁可以帮助我吗?

解决方法

您是针对Silverlight,还是针对Windows Phone 8.1的WinRT(Universal Apps)?

如果你选择了第二个选项,那么在这个blog post MVVM Light中,作者解释了对EventToCommand缺乏支持 – 基本上在WinRT中已经有一个类似于EventToCommand – Behaviors的机制.

MVVM Light Toolkit(二、创建 MvvmLight 项目)

MVVM Light Toolkit(二、创建 MvvmLight 项目)

二、创建 MvvmLight 项目

MVVM Light Toolkit 安装完成后,从 VS2010 的新建项目列表中可以找到以 “MvvmLight” 开头的五类项目模板。因为我要把一个原有的 WPF 项目移植到 MVVM Light Toolkit 框架中,所以选择新建一个 “MvvmLight (WPF4)” 项目。

新建的 MvvmLight 项目默认结构如下,其中需要关注的是 App.xaml、App.xaml.cs 和 ViewModelLocator.cs。

把已有项目的文件挪到新建的 MvvmLight 项目中,除了必要的命名空间、Properties 和引用的更改,还有两个需要特别注意的地方:一是要把 MvvmLight 项目的 App.xaml 中关于 ViewModelLocator 的一句 xaml 合并到已有项目的 App.xaml 中,二是要把 MvvmLight 项目的 App.xaml.cs 中关于 DispatcherHelper 的一句 C# 合并到已有项目的 App.xaml.cs 中,分别如下两图所示。

编译通过。

作者:李凤桐;出处:http://www.cnblogs.com/phoenixtrees。

MVVM 框架 - MVVMLight

MVVM 框架 - MVVMLight

项目 URL:http://www.mvvmlight.net/

一、安装 MVVMLight

在 NuGet 程序包中搜索 MVVMLight,然后安装。

 

二、使用

 安装完 MVVMLight 后项目中会自动生成 ViewModel 目录,并且目录中会生成 ViewModelLocator.cs 文件

App.xaml 会自动添加代码,注册全局变量 Locator

<Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:WpfTest.ViewModel" />
        </ResourceDictionary>
    </Application.Resources>

建立 Model 目录放置 model 类,View 目录放置 view 类

 在 Model 下添加 PeopleModel.cs,继承 ObservableObject 类,ObservableObject 实现了 INotifyPropertyChanged 接口,所有 PeopleModel 的属性改变可以通知控件绑定属性

public class PeopleModel : ObservableObject
    {
        private string name = "";
        public string Name { get => name; set => Set(ref name, value); }
    }

 在 ViewModel 下添加 PeopleViewModel.cs,继承 ViewModelBase 类,ViewModelBase 类继承 ObservableObject 类

public class PeopleViewModel : ViewModelBase
    {
        private PeopleModel people = new PeopleModel();
        public PeopleModel People { get => people; set => Set(ref people, value); }
//不带参数命令
        public ICommand CmdUpdateName
        {
            get
            {
                return new RelayCommand(new Action(() =>
                {
                    People.Name = "无参数";
                }));
            }
        }
//带参数命令
        public ICommand CmdUpdateName1
        {
            get
            {
                return new RelayCommand<object>(new Action<object>(t =>
                {
                    People.Name = System.Convert.ToString(t);
                }));
            }
        }
    } 

在 ViewModelLocator.cs 里注册 PeopleViewModel 元素

/// <summary>
    /// This class contains static references to all the view models in the
    /// application and provides an entry point for the bindings.
    /// </summary>
    public class ViewModelLocator
    {
        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        /// </summary>
        public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            ////if (ViewModelBase.IsInDesignModeStatic)
            ////{
            ////    // Create design time view services and models
            ////    SimpleIoc.Default.Register<IDataService, DesignDataService>();
            ////}
            ////else
            ////{
            ////    // Create run time view services and models
            ////    SimpleIoc.Default.Register<IDataService, DataService>();
            ////}

            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<PeopleViewModel>();
        }

        public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

        public PeopleViewModel PeopleVM
        {
            get
            {
                return ServiceLocator.Current.GetInstance<PeopleViewModel>();
            }
        }

        public static void Cleanup()
        {
            // TODO Clear the ViewModels
        }
    }  

在 View 目录下添加 PeopleWindow 窗体,并给 window 的 DataContext 属性绑定 PeopleVM 元素

<Window x:Class="WpfTest.View.PeopleWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest.View"
        mc:Ignorable="d"
        Title="PeopleWindow" Height="450" Width="800"
        DataContext="{Binding Source={StaticResource Locator}, Path=PeopleVM}">
    <Grid>
        <Button Command="{Binding CmdUpdateName}" Content="无参数" HorizontalAlignment="Left" Margin="10,31,0,0" VerticalAlignment="Top" Width="75"/>
        <Button Command="{Binding CmdUpdateName1}" CommandParameter="有参数" Content="有参数" HorizontalAlignment="Left" Margin="10,69,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="{Binding People.Name}" HorizontalAlignment="Left" Margin="135,33,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1.663,-1.363"/>
    </Grid>
</Window>

 界面效果:

(1)点击无参数按钮:

(2)点击有参数按钮

 

 

参考:

https://www.cnblogs.com/manupstairs/p/4890300.html 里面有对 MVVMLight 比较详细的解释

MVVMLight ViewModel文件夹丢失

MVVMLight ViewModel文件夹丢失

如何解决MVVMLight ViewModel文件夹丢失?

我正在尝试为我的.NET Core应用程序安装MVVMLight,但是在完成安装后,不会生成viewmodel文件夹。过去,我曾使用过.NET Framework和MVVMLight,而且效果很好。有人知道我该如何修复,以便生成viewmodel文件夹以及Mainviewmodel.cs和viewmodelLocator.cs吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

mvvmlight 下 passwordBox 绑定的解决方法

mvvmlight 下 passwordBox 绑定的解决方法

在做公司的项目中,用到 MVVMLight 框架,需要做登陆注册的功能模块,但是在 wpf 中 passwordBox 没有内置绑定功能,因为出于安全的考虑。但是,博主又非常想要契合 mvvm 思想,一定要 passwordBox 在 View 绑定到 ViewModel,经过网上查找,以及多次实验,终于成功。特此记录。

(开发环境:vs2015+EF+mvvmlight+sql server2016)

首先建一个 Helper 类:

public class PasswordBindingHelper
    {
        public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordBindingHelper),
        new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

        public static readonly DependencyProperty AttachProperty =
            DependencyProperty.RegisterAttached("Attach",
            typeof(bool), typeof(PasswordBindingHelper), new PropertyMetadata(false, Attach));

        private static readonly DependencyProperty IsUpdatingProperty =
           DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
           typeof(PasswordBindingHelper));


        public static void SetAttach(DependencyObject dp, bool value)
        {
            dp.SetValue(AttachProperty, value);
        }

        public static bool GetAttach(DependencyObject dp)
        {
            return (bool)dp.GetValue(AttachProperty);
        }

        public static string GetPassword(DependencyObject dp)
        {
            return (string)dp.GetValue(PasswordProperty);
        }

        public static void SetPassword(DependencyObject dp, string value)
        {
            dp.SetValue(PasswordProperty, value);
        }

        private static bool GetIsUpdating(DependencyObject dp)
        {
            return (bool)dp.GetValue(IsUpdatingProperty);
        }

        private static void SetIsUpdating(DependencyObject dp, bool value)
        {
            dp.SetValue(IsUpdatingProperty, value);
        }

        private static void OnPasswordPropertyChanged(DependencyObject sender,
            DependencyPropertyChangedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;
            passwordBox.PasswordChanged -= PasswordChanged;

            if (!(bool)GetIsUpdating(passwordBox))
            {
                passwordBox.Password = (string)e.NewValue;
            }
            passwordBox.PasswordChanged += PasswordChanged;
        }

        private static void Attach(DependencyObject sender,
            DependencyPropertyChangedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;

            if (passwordBox == null)
                return;

            if ((bool)e.OldValue)
            {
                passwordBox.PasswordChanged -= PasswordChanged;
            }

            if ((bool)e.NewValue)
            {
                passwordBox.PasswordChanged += PasswordChanged;
            }
        }

        private static void PasswordChanged(object sender, RoutedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;
            SetIsUpdating(passwordBox, true);
            SetPassword(passwordBox, passwordBox.Password);
            SetIsUpdating(passwordBox, false);
        }
    }

View:

<Page x:Class="SGGS.SmartGroundGuidence.Pages.LoginPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:SGGS.SmartGroundGuidence.Pages"
      xmlns:helper="clr-namespace:SGGS.SmartGroundGuidence.CommonHelper"
      mc:Ignorable="d" 
      Title="LoginPage">
    <Page.DataContext>
        <Binding Path="LoginPage" Source="{StaticResource Locator}"></Binding>
    </Page.DataContext>

    <Grid VerticalAlignment="Top" Width="512" Height="417">
        <Grid.Background>
            <ImageBrush ImageSource="Resources/bg_login_popup.png" />
        </Grid.Background>
        <Grid.RowDefinitions>
            <RowDefinition Height="60"></RowDefinition>
            <RowDefinition Height="58"></RowDefinition>
            <RowDefinition Height="20"></RowDefinition>
            <RowDefinition Height="58"></RowDefinition>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition Height="29"></RowDefinition>
            <RowDefinition Height="60"></RowDefinition>
            <RowDefinition Height="57"></RowDefinition>
            <RowDefinition Height="52"></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="1">
            <Grid Height="58" Width="404">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="115*"></ColumnDefinition>
                    <ColumnDefinition Width="289*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBox  Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource SltTxtLogin}" Text="{Binding LoginUser.UserName,UpdateSourceTrigger=PropertyChanged}"/>
                <Label Grid.Column="0" FontSize="18" Foreground="White" Content="用户名" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </StackPanel>
        <StackPanel Grid.Row="3">
            <Grid Height="58" Width="404">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="115*"></ColumnDefinition>
                    <ColumnDefinition Width="289*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <PasswordBox Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource SltPwbLogin}" MaxLength="20" helper:PasswordBindingHelper.Password="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                <Label Grid.Column="0" FontSize="18" Foreground="White" Content="密码" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </StackPanel>
        <StackPanel Grid.Row="5">
            <Grid Width="404">
                <CheckBox Style="{StaticResource MyCheckBoxStyle}" HorizontalAlignment="Left" Margin="15,0,0,0" IsChecked="{x:Null}"></CheckBox>
            </Grid>
        </StackPanel>
        <StackPanel Grid.Row="7" Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Style="{StaticResource StlBtnLogin}" />
            <Button Style="{StaticResource StlBtnRegister}" Margin="72,0,0,0"/>
        </StackPanel>
    </Grid>
</Page>

剩下的 Model 和 ViewModel 以及 ViewModelLocator 就是 MVVMLight 的事了,和本文无关,记录到此。

 

关于windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?windows event collector无法启动的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于MVVM Light Toolkit(二、创建 MvvmLight 项目)、MVVM 框架 - MVVMLight、MVVMLight ViewModel文件夹丢失、mvvmlight 下 passwordBox 绑定的解决方法等相关知识的信息别忘了在本站进行查找喔。

本文标签: