在本文中,我们将详细介绍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无法启动)
- MVVM Light Toolkit(二、创建 MvvmLight 项目)
- MVVM 框架 - MVVMLight
- MVVMLight ViewModel文件夹丢失
- mvvmlight 下 passwordBox 绑定的解决方法
windows-phone-8 – Windows Phone 8.1 – MVVMLight – 为什么EventToCommad不工作?(windows event collector无法启动)
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在“交互”类型中找不到可附加属性“触发器”.
…
有谁可以帮助我吗?
解决方法
如果你选择了第二个选项,那么在这个blog post MVVM Light中,作者解释了对EventToCommand缺乏支持 – 基本上在WinRT中已经有一个类似于EventToCommand – Behaviors的机制.
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 中,分别如下两图所示。
编译通过。
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文件夹丢失?
我正在尝试为我的.NET Core应用程序安装MVVMLight,但是在完成安装后,不会生成viewmodel文件夹。过去,我曾使用过.NET Framework和MVVMLight,而且效果很好。有人知道我该如何修复,以便生成viewmodel文件夹以及Mainviewmodel.cs和viewmodelLocator.cs吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
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 绑定的解决方法等相关知识的信息别忘了在本站进行查找喔。
本文标签: