新足迹

 找回密码
 注册

精华好帖回顾

· DIY 之 Decking (图文并茂)重点在 camo hidden system (2016-5-9) pengruijun · 甜蜜11月 - 彩虹蛋糕 (2007-11-3) angelhair
· 无本地经验,如何找到第一份工+你也可以活得很精彩+转行讨论+设计你的职业人生 (2013-6-22) 紫衣 · 我做得凉皮 (2005-9-3) silence
Advertisement
Advertisement
查看: 1547|回复: 22

问个Silverlight 的弱智问题 [复制链接]

2010年度奖章获得者

发表于 2011-4-27 23:40 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请教高人 <DataGrid> 的MouseOver Row 的颜色 如何 自定义???
xaml实在让人大汗啊。。。。 (千外别提到Blend去改, 千万别告诉我要把几百多行default style copy来再改。。。)

找遍整个股沟无解,哪位能告知,浆糊上就多了个股沟杀手

[ 本帖最后由 dalaohu 于 2011-4-27 23:46 编辑 ]
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-4-28 00:09 |显示全部楼层

再问一个

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
UserControl上的hardcoded Property 如何能比较优雅的Pass到ViewModel?

比如<uc:CategoryView CategoryId="1"/>
如何能把 CategoryId="1" pass 到CategoryViewModel?

具体点说,比如在用MVVMLight 中?
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-28 09:56 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
第二个问题,CategoryId要定义成dependency property

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

2010年度奖章获得者

发表于 2011-4-28 16:45 |显示全部楼层

回复 linkspeed 3# 帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在View里加一个DependencyProperty 没问题, 问题是ViewModel 如何能得到这个值。

继续探索中。。。
头像被屏蔽

禁止发言

发表于 2011-4-28 16:53 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ViewModel 是那个view的datacontext
自然就得到了。你不用管的。

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

头像被屏蔽

禁止发言

发表于 2011-4-28 16:55 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
sorry, 我说错了
那个dependent property binding to view model 的property上
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-4-28 17:05 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我初步的看了一下, 说是要DP, ViewModel必须是 inherit from DependencyObject

问题是很多MVVM framwork, ViewModel 默认是 inherit INotifyPropertyChanged 的。
我倒是可以用Messenger 来传递,但觉得不优雅。

比如说
xaml code behind:
panel.Children.Add(new MyView());
Messenger.Default.Send("custom value");

我希望的是一行:
panel.Children.Add(new MyView { MyProperty = 1});
此时我希望 VM 能得到 "MyProperty = 1"
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

2010年度奖章获得者

发表于 2011-4-28 17:12 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 linkspeed 于 2011-4-28 16:53 发表
ViewModel 是那个view的datacontext
自然就得到了。你不用管的。


我想要的是 当这个VM 初始化是,可以根据不同的初始值来返回不同的结果。

比如说这个VM里有个
public void Load(int categoryId)
{
    MostRecentPosts = rep.GetMostRecentPosts(categoryId);
}

这个是发生在Binding之前的, 用这个结果再Binding到Xaml View
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-28 17:20 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ViewModel要实现INotifyPropertyChanged
然后每次MostRecentPosts 值变的时候都
RaisePropertyChanged("MostRecentPosts ");
不用管binding之前之后

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

2010年度奖章获得者

发表于 2011-4-28 17:20 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
It seems that Dependency Properties should be used in controls that you create such as Buttons. To use properties in XAML and use all the WPF features, those properties must Dependency Properties.

However, your ViewModel is better off using INotifyPropertyChanged. Using INotifyPropertyChanged will give you the ability to have getter/setter logic if you need to.
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

2010年度奖章获得者

发表于 2011-4-28 17:28 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 linkspeed 于 2011-4-28 17:20 发表
ViewModel要实现INotifyPropertyChanged
然后每次MostRecentPosts 值变的时候都
RaisePropertyChanged("MostRecentPosts ");
不用管binding之前之后


这么说吧, 我最简单给个我想要的,你说说建议。

我就想要在xaml里能这样写。

<views : PostView CategoryId="1" /> //显示 Category 1 里的所有Post
<views : PostView CategoryId="2" /> //显示 Category 2 里的所有Post

你说说在为了要xaml能这样写。 PostView, PostViewModel 应该如何结构?
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2011-4-28 20:36 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
<views : PostView CategoryId="{Binding Path=CategoryId}" />

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

2010年度奖章获得者

发表于 2011-4-28 22:12 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我就想要在xaml里能这样写。

<views : PostView CategoryId="1" /> //显示 Category 1 里的所有Post
<views : PostView CategoryId="2" /> //显示 Category 2 里的所有Post


请注意我的问题,我是说XAML里必须这么写的话, View, VM应该如何结构?

(原因是, CategoryId 必须从UI pass 到VM,VM才能用这个ID来query - )

× 纯技术讨论,这个 CategoryId 我hardcode 的value。 必须这么写。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-28 23:07 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
把binding用代码写。双向binding
xaml里面用直接赋值

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

2010年度奖章获得者

发表于 2011-4-29 00:30 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SL功力还不深,MVVM本身也比较新,网上也是众说纷纭。
我现在唯一能想到并接受的做法就是 Dynamic View/ViewModel

在VM上加一个overload
ie。
PostViewModel(int categoryId) { ... }

然后我必须在xaml的codebehind 手工加载。
ie。

var postView1 = new PostView();
postView1.DataContext = new PostViewModel(1);
var postView2 = new PostView();
postView2.DataContext = new PostViewModel(2);

panel.Children.Add(postView1);
panel.Children.Add(postView2);
...
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-29 09:02 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这样啊。这里有2个不同的问题

1. 同样类型不同的实例的view要配上不同的viewmodel。

2. 如何把xaml里面的dependent property传递到vm里面去。

第一个问题,view如何配上viewmodel,这个有很多做法。你的做法是最简单直接的一种,不算不好的办法。

一般的做法是这样:
既然你有2个PostView。那么假设这2个postview在同一个MainPage.xaml里面。那么这个MainPage也有一个VM -- MainPageVM

这样MainPageVM 只需要一个实例,MainPage和MainPageVM是一一对应的,你可以用直接在xaml里面设定DataContext.

MainPageVM 里面可以有2个property,类型都是PostViewModel。 FirstPostViewModel and SecondPostViewModel.

在MainPage.xaml里面,用databinding把 PostView的2个实例分别绑定到这2个property上面。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-4-29 09:46 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
2个是打比方用得, 实际中会是200个,或上千个CategoryId.

所以必须是dynamic view,  用foreach loop 里来动态加载到MainPage里。
头像被屏蔽

禁止发言

发表于 2011-4-29 10:03 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如何把vm赋值给view可以随便做了。这个无所谓的。

你这个问题在于,你需要databinding时候先把UI的值送到VM里面
即target的值先反送到source那里,
而twoway binding会先把source的值赋给target。

执行顺序是这样的:
1. postview.category先获得"1",这个时候datacontext=null
2. 等有了datacontext的时候, postviewvm.category = ""
3. 建立binding的时候 postview.category会被清成""

所以需要稍微绕个弯。代码在附件里面。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1积分 +3 收起 理由
dalaohu + 3 谢谢奉献

查看全部评分

2010年度奖章获得者

发表于 2011-4-29 11:13 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不错。 在View上加DP, 用DP更VM里的Property绑定起来。
反正View里肯定要放code了,有些人说view里绝对不放code,真不知道怎么个高法。

等我写好了,放上来再讨论讨论。

你用了那个足迹Reader没? 我现在在把它都改写成mvvm的。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-29 11:25 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
>反正View里肯定要放code了,有些人说view里绝对不放code,
>真不知道怎么个高法。

不值得钻牛角尖。随便爱放不放都可以。

view和viewmodel大体上分开就可以了。
任何一个design pattern都会有很多变种。
其实不需要严格的规定这个那个的。
头像被屏蔽

禁止发言

发表于 2011-4-29 11:27 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
》实际中会是200个,或上千个CategoryId.

不知道你怎么实现virtualization,根据滚动情况来动态的产生postview。而不是一下子产生上千个postview.

datagrid有用virtualization。用和不用速度差不少。
我的情况还是小于100行。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-4-29 11:41 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在那个足迹reader里,大概有30个个论坛,每个论坛就是一个 View。

在实际中其实他们都是trigger by RelyCommand 的。 然后动态加载用户选择要阅读的Forum。

我只是非常好奇想知道如果我就用hardcode 来会如何实现。
<view:ForumView ForumId="41"/>
<view:ForumView ForumId="63"/>
<view:ForumView ForumId="52"/>
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
头像被屏蔽

禁止发言

发表于 2011-4-29 16:36 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
老兄,为神马你可以有这么长的签名?

俺死劲想苹果的用途,好不容易憋出来2点-上网听歌
果粉的热请就是盲目啊!决定还是高配 - 公主

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部