Один экземпляр Usercontrol, используемый в нескольких UserControls - PullRequest
0 голосов
/ 14 марта 2012

Я работаю над приложением Prism WPF.Сценарий таков: у меня есть представление (с фильтрами, скажем, ViewF) и 2 других представления, которые будут содержать ViewF.Примерно так, как показано ниже в XAML:

<UserControl View1>
    <local:ViewF/>
</UserControl>`

<UserControl View2>
    <local:ViewF/>
</UserControl>

Проблема в том, что я хочу использовать один и тот же экземпляр и состояние ViewF в View1 и view2.Я попытался передать текст данных ViewF в View1 и View2, но это не работает, потому что сам xaml создает разные экземпляры.

Любая идея, пожалуйста, поделитесь, как это сделать.

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Вы не можете иметь один и тот же экземпляр UserControl у разных родителей.XAML выдаст вам исключение типа The instance of UserControl is already added as child to another container.Зачем вам "тот же экземпляр" UserControl?Это невозможно.Вы должны как-то поделиться этой функциональностью через DataContext.

0 голосов
/ 14 марта 2012

Вы можете определить фильтры как общий ресурс , например

<Application.Resources>
    <local:ViewF x:Key="filters"/>
</Application.Resources>
<UserControl> <!-- View1 -->
    <StaticResource ResourceKey="filters"/>
</UserControl>
<UserControl> <!-- View2 -->
    <StaticResource ResourceKey="filters"/>
</UserControl>
0 голосов
/ 14 марта 2012

Если бы я правильно понял вашу проблему, это помогло бы вам.

Предположим, у каждого представления есть ViewModel.Допустим, View1VM, View2VM и ViewFVM являются виртуальными машинами для View1, View2 и ViewFM соответственно.Пусть MainVM будет ViewModel окна, в котором будут размещаться View1 и View2.

Иметь экземпляр ViewFVM в MainVM.При создании экземпляров View1VM и View2VM внедрите экземпляр MainVM (также можно использовать интерфейсы, чтобы каждому представлению были доступны только соответствующие данные) и иметь свойство в View1 и View2, которое возвращает экземпляр ViewFVM mainVM.Привязать его к текстовому тексту ViewF в xaml.

Код будет выглядеть следующим образом:

public class ViewFVM
{
    //Store the state of ViewF
}

public class MainVM
{
    public ViewFVM viewFVM;
    public MainVM()
    {
        View1VM view1VM = new View1VM(this);
        View2VM view2VM = new View2VM(this);
    } 
}

public class View1VM
{
     private MainVM _mainVM;
     public View1VM(MainVM mainVM)
     {
         _mainVM = mainVM;
     }

     public ViewFVM ViewFViewModel {get {return _mainVM.viewFVM;}}
}

public class View2VM
{
    private MainVM _mainVM;
     public View2VM(MainVM mainVM)
     {
         _mainVM = mainVM;
     }

     public ViewFVM ViewFViewModel {get {return _mainVM.viewFVM;}}
}    

В xaml каждого представления, т. Е. Для View1 и View2, установите ViewFViewModel в качестве datacontext посредством привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...