XAML C # Функция в нескольких окнах - PullRequest
1 голос
/ 08 сентября 2011

У меня есть программа, над которой я работаю, которая имеет несколько окон.Окна схожи по функциональности, и я хочу иметь один обработчик событий, чтобы покрыть событие нажатия кнопки для каждого окна в приложении.Возможно ли это?

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Если вам нужно привязать обработчик к коду, вы можете инкапсулировать обработчик делегатом и добавить его в Windows, которая ему требуется.

Например, используя Action<T>:

Action<string> commonHandler = (parameter) => 
   { 
         // handler code here 
   };


class MyWindiow
{

   public MyWindiow(Action<string> handler)
   { 
         // store to local and assign to button click
         // button.CLick += (o, e) => { handler(parameterToBepassed); }
   }
}
0 голосов
/ 08 сентября 2011

Я бы посмотрел на использование фреймворка, чтобы помочь вам здесь. Мой любимый Prism v4 .

Если вы будете следовать шаблону проектирования M-V-VM , ваша жизнь станет намного проще. Вам нужно понимать привязку данных и DataContext .


При этом, если вы решите пойти по этому пути, вы можете привязать каждое из ваших окон к команде:

<Button Command="{Binding DoFooCommand}" Content="DoFoo"/>

Ваш ViewModel должен был бы выполнить DelegateCommand член.

public class SomeViewModel : NotificationObject
{
    public SomeViewModel()
    {
        DoFooCommand = new DelegateCommand(ExecuteFoo);
    }

    public DelegateCommand DoFooCommand { get; set; }

    private void ExecuteFoo()
    {
        //Use the EventAggregator to publish a common event
    }
}

И, наконец, где-то еще в вашем решении у вас будет файл / класс кода, который подписывается на событие и ждет, пока кто-нибудь опубликует событие, чтобы обработать его.

public class SomeOtherPlace
{
    public SomeOtherPlace()
    {
        //Use the EventAggregator to subscribe to the common event
    }

    public void FooBarMethodToCallWhenEventIsPublished(SomePayload payload)
    {
        //Do whatever you need to do here...
    }
}

Я понимаю, что некоторые вещи были опущены (например, что такое SomePayload ... посмотрите информацию о EventAggregator), но я не хотел вдаваться в подробности. Просто дайте вам руководство о том, куда обращаться за информацией, и некоторый базовый код для работы. Если вы решите использовать EventAggregator, то вам нужно убедиться, что ваш подписывающий вызов и публикуемые вызовы используют тот же экземпляр EventAggregator. Вы можете сделать это, посмотрев на MEF . Призма настроена на идеальную работу с MEF ... Я не собираюсь лгать. Выполнение всего этого требует некоторой кривой обучения, но в конечном итоге это будет полезно, когда вы сможете легко тестировать свои модели ViewModel и свободно связывать свой код. EventAggregator - отличный способ для разных классов общаться друг с другом, не полагаясь на знание друг друга. А MEF отлично подходит для того, чтобы иметь Контейнер для ваших сервисов, который вы хотите использовать в своем приложении.

Надеюсь, что это дало вам некоторое представление о том, как делать то, что вы хотите делать на правильном пути.

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