中易网

WPF怎么从后台页面替换前台页面的控件模板(ItemTemplate)

答案:1  悬赏:30  
解决时间 2021-03-24 07:06
我有一个页面A.asmx,里面有个ListBox控件,
它的ItemTemplate="{DynamicResource TemplateA}" />
页面有两个Template
<DataTemplate x:Key="Template1">
<DataTemplate x:Key="Template2">
业务中用户有个更换Template的功能,需要把ListBox的ItemTemplate设置为Template2
一般情况下是在A.asmx.cs文件中这么写:
this.ListBox1.ItemTemplate = (DataTemplate)this.FindResource("Template2");
但是我的A.asmx页面的DataContext设置成了A.ViewModel.cs页面
请问:如何在A.ViewModel.cs里更改模板ListBox1的ItemTemplate
最佳答案
看得出你的意思,你使用了mvvm模式,然后希望在viewmodel内部切换前端的DataTemplate。因为viewmodel理论上是不引用前端的,所以你肯定无法访问前端任何一个DataTemplate。所以你可以这样做:
1. 把你需要在ViewModel中切换的DataTemplate切换到程序的资源字典中,资源字典也就是wpf的ResourceDictionary,你的ViewModel是可以访问到的。
2. 在ViewModel中设置一个String类型的属性,例如SelectedTemplate,用于之后的模板切换。
3. 在你前端的ItemTemplate位置绑定这个SelectedTemplate属性,但你需要一个Converter来辅助样式的切换。
<ListBox ItemTemplate ="{Binding Path=SelectedTemplate, Converter={StaticResource StringToDataTemplateConverter}}">
4. 这个Converter你可以这么写:
public class StringToDataTemplateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return InternalConvert(value, targetType, parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object InternalConvert(object value, Type targetType, object parameter)
    {
        if(value == null)
        {
            return null;
        }

        var resources = Application.Current.Resources.MergedDictionaries.ToList();

        foreach (var dict in resources)
        {
            foreach (var objkey in dict.Keys)
            {
                if (objkey.ToString() == value.ToString())
                {
                    return dict[objkey] as DataTemplate;
                }
            }
        }

        return null;
    }
}这样一来前端的ItemTemplate就可以和ViewModel的SelectedTemplate完成绑定,你更改SelectedTemplate的值,你的Converter就会在资源字典中查找对应的DataTemplate了。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
儿子十二岁,晚上经常说梦话,是缺少哪种营养
X每个经历都是独一无二的不要拿自己的经历去
加盟服装微店但又害怕被对方骗取加盟费
支付宝线下收单怎么代理
韩国东大门服装淘宝有代购或者服装批发的吗
他们两个人学习都很好 用英语怎么说?
我是做家电制冷维修的(我合肥的),家用电器基
蒸脸器正确使用方法谁能给我介绍下?有什么用
经常吃烧茄子容易长肉吗?茄子为什么很少炒着
请问在小区开个小超市怎么样?房租4500一月,
求2003版《倩女幽魂》连续剧 DVD 原盘
晚上喝白醋真的可以减肥吗?对身体有害吗。 男
写一篇关于泉州的作文
原道M9能不能刷windows系统?
急急。北京朝阳区农民日报社附近附近有农村信
推荐资讯
从沈阳开车到天津市怎么走?需要多长时间?
7橙酒店移动直销商城现在有微信版吗?
甲减怎么减肥啊?
请各位大神专家帮忙鉴定这是石铁陨石吗?具有
晚上见到空中有象火苗一样的东西,时隐时显到
上海水产大学(军工路)附近有新疆餐厅或回民
QQ空间的像册怎么弄成一个大心型的
孕二十一周,肚子白天看起来挺大的,到第二天
阿凡达hardwareID CB32A539536E337B7A50B42E8
房子装修,总共115平,帮我看看这个半包的预
这个闹钟怎么用,顶部开关怎么用?(图片为闹
美容院加盟连锁店好做吗??
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?