當前位置:成語大全網 - 新華字典 - WPF怎麽從後臺頁面替換前臺頁面的控件模板(ItemTemplate)

WPF怎麽從後臺頁面替換前臺頁面的控件模板(ItemTemplate)

看得出妳的意思,妳使用了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了。