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

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

看得出你的意思,你使用了mvvm模式,然后希望在viewmodel内部切换前端的DataTemplate。因为viewmodel理论上是不引用前端的,所以你肯定无法访问前端任何一个DataTemplate。所以你可以这样做:

把你需要在ViewModel中切换的DataTemplate切换到程序的资源字典中,资源字典也就是wpf的ResourceDictionary,你的ViewModel是可以访问到的。

在ViewModel中设置一个String类型的属性,例如SelectedTemplate,用于之后的模板切换。

在你前端的ItemTemplate位置绑定这个SelectedTemplate属性,但你需要一个Converter来辅助样式的切换。

<ListBox ItemTemplate ="{Binding Path=SelectedTemplate, Converter={StaticResource StringToDataTemplateConverter}}">

这个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了。

所提问题与错误无关.

你发生问题的地方在於 Ellipse.NameProperty, 对於作为 FrameworkElementFactory, 它的 Name 属性可不是通过设置 NameProperty来设定, 而必须是在构造时完成.

对於你的代码, 只要将两行稍作修改即可:

FrameworkElementFactory ellipse = new FrameworkElementFactory(typeof(Ellipse), "templateEllipse") // 在构造中就指定名字

// ellipse.SetValue(Ellipse.NameProperty, "templateEllipse")将这行注释掉


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11538900.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存