|ZYCWPF| Interaction.Triggers 触发后台属性更新后台属性时报错的总题,有示例

javamy019 2012-11-01 05:59:39

<Window x:Class="SQRC_ViewModel觖发修改ViewModel属性.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Title="{Binding Title}" Height="350" Width="525">
<Grid>
<Border Name="brInkMessage" Grid.Column="1" Grid.Row="2">
<StackPanel>
<TextBox x:Name="txt3" Text="{Binding IsLogin, UpdateSourceTrigger=PropertyChanged}" />
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsLogin}" Value="True">
<ei:ChangePropertyAction TargetObject="{Binding}" PropertyName="Title" Value="Changed" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</StackPanel>
</Border>
</Grid>
</Window>


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SQRC_ViewModel觖发修改ViewModel属性
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}

class MainWindowViewModel : NotificationObject
{
private string title;
/// <summary>
/// ??
/// </summary>
public string Title
{
get { return title; }
set
{
title = value;
this.RaisePropertyChanged("Title");
}
}

private bool isLogin;
/// <summary>
/// ??
/// </summary>
public bool IsLogin
{
get { return isLogin; }
set
{
isLogin = value;
this.RaisePropertyChanged("IsLogin");
}
}
}

class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}


以上我的XAML中写了一个数据触发器,当IsLogin=true的时候将Title改为Changed
运行是正常的
但是把觖发器中的
<ei:DataTrigger Binding="{Binding IsLogin}" Value="True">
改为
<ei:DataTrigger Binding="{Binding IsLogin}" Value="False">
后就出现错误了
提示:Cannot find a property named "Title" on type "StackPanel"

这个要怎么解决

谢谢

PS:可能你们会说,我这样的业务逻辑不对,但是会存在这个情况,当多皮肤的时候,有一个皮肤想根据登录情况来自定自己的标题,这样是他自定义的其他模版都没有,所以在XAML中修改是比较好的情况

谢谢
...全文
544 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhx527099095 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

肯定会有适合在UI上执行操作的场合,但是你说的皮肤这种情况应该更适合在model里处理。
ViewModel不是用来处理业务逻辑的,它只是用来处理UI逻辑。
VM包含两个部分:UI用到数据,以及这些数据的处理逻辑
另外还有一部分M-V,其中V是View,就是UI,M才是业务模型,包含业务模型和逻辑。
所以才是Model-View-ViewModel。
所以我的观点是ViewModel(……
[/Quote]

同意 vm其实是逻辑ui
举一个最简单的例子给你
比如你有一个实体需要展示3d和2d的view
当你在2d选中的时候 你需要同时跟新3d的view
如果你用mvvm 只需要在vm里面跟新数据
3d会跟着变的 所以这就是mvvm的精髓啊


jshi123 2012-11-01
  • 打赏
  • 举报
回复
肯定会有适合在UI上执行操作的场合,但是你说的皮肤这种情况应该更适合在model里处理。
ViewModel不是用来处理业务逻辑的,它只是用来处理UI逻辑。
VM包含两个部分:UI用到数据,以及这些数据的处理逻辑
另外还有一部分M-V,其中V是View,就是UI,M才是业务模型,包含业务模型和逻辑
所以才是Model-View-ViewModel。
所以我的观点是ViewModel(M-V-VM)作为UI显示模型,应该包含UI数据和UI处理逻辑
http://baike.baidu.com/view/3507915.htm
javamy019 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
2#的思路应该是对的,就是尽量由模型来控制界面。看看这样是不是能满足你的业务要求:

[/Quote]
我是不太同意这种的,我感觉UI就完全交给UI,而CS的话只管业务逻辑

如上面说的定义Title这个不关业务逻辑的为什么不交给UI来做呢?
UI想干什么就干什么,我写CS也不用管他去怎么展示
但CS的只管告诉UI的说你要给我什么数据
而UI也只管CS说,你返回什么数据
最后UI想怎么展示就UI去展示,而CS不用去管他
jshi123 2012-11-01
  • 打赏
  • 举报
回复
2#的思路应该是对的,就是尽量由模型来控制界面。看看这样是不是能满足你的业务要求:

// 根据不同的登录状态显示不同的标题
private string title1="title login", title2 = "title not login";
public string Title
{
get { return IsLogin? title1 : title2 ; }
}
jshi123 2012-11-01
  • 打赏
  • 举报
回复
还是初始化时候取值的问题。
初始化时,DataContext为空,ChangePropertyAction找不到TargetObject,就在这个action所属的StackPanel上找Title,也找不到就报错。

解决办法还是把构造函数里的语句位置换下:
this.DataContext = new MainWindowViewModel();
InitializeComponent();
lhx527099095 2012-11-01
  • 打赏
  • 举报
回复
理解错了 呵呵 不好意思
但是实际上还是像你自己说的 这个完全可以放在IsLogin的set方法里面
判断下如果value=true 或者false改变Title
so easy 不要和自己过不去么 呵呵
lhx527099095 2012-11-01
  • 打赏
  • 举报
回复
你的stackpanel里面有 x:name=“Title”的元素么
没看到有啊?

111,101

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧