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

我有一个页面A.asmx,里面有个ListBox控件,它的ItemTemplate="{DynamicResourceTemplateA}"/>页面有两个Template... 我有一个页面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
展开
 我来答
百度网友d242235
推荐于2017-11-26 · TA获得超过2385个赞
知道大有可为答主
回答量:1403
采纳率:84%
帮助的人:821万
展开全部

看得出你的意思,你使用了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了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式