Есть две namespace, Допустим Root.NSA и Root.NSB. В этих пространствах есть по два класса A и B. т.е. имеем четыре класса Root.NSA.A, Root.NSA.B, Root.NSB.A, Root.NSB.B
Далее мы создаем окно Windows со следующим XAML
Все просто отлично, однако, мне необходимо создать такое же окно, с таким же расположением контролов, только с другим xmlns:ForNameSpace, а именно xmlns:ForNameSpace="clr-namespace:Root.NSB"
Теперь собственно вопрос. Мне придется создавать 2 окна и контролировать идентичность кода .cs и .XAML или есть какое - то другое решение?
PS: использую в основном {x:Static ForNameSpace:A.StaticProperty}, {x:Type ForNameSpace:A}, {x:Static ForNameSpace:B.StaticProperty}, {x:Type ForNameSpace:B} и т.д.
PS2: Еще уточнение: Все классы наследуются от Root.A и Root.B, т.е.
class Root.NSA.A : Root.A
class Root.NSA.B : Root.B
class Root.NSB.A : Root.A
class Root.NSB.B : Root.B
Ответ
Все
переименовал в
добавил DataTemplateSelector
public class MyDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
string key = "r_" + item.GetType().Name;
DependencyObject root = null;
DependencyObject next = container;
while (next != null)
{
root = next;
next = System.Windows.Media.VisualTreeHelper.GetParent(root);
}
if ((root as FrameworkElement).Resources.Contains(key))
return (root as FrameworkElement).Resources[key] as DataTemplate;
return null;
}
}
также в класс окна добавил свойство
public MyDataTemplateSelector DataTemplateSelector { get; } = new MyDataTemplateSelector();
и обозвал окно
теперь во всех контролах, где использую шаблоны добавил
ItemTemplateSelector="{Binding ElementName=f_MyWindow, Path=DataTemplateSelector}"
и вуаля, неважно какой namespace у класса во ViewModel, главное чтобы имя класса совпадало с r_[имя класса]. Можно еще было в MyDataTemplateSelector проверить является ли потомком класса Root.A или Root.B, но у меня не стояла в этом задача.
ЗЫ: префикс r_ можно заменить на любой другой, особой разницы нет.
Комментариев нет:
Отправить комментарий