Сценарий пользовательского интерфейса WPF - лучший способ добавить функциональность в 50 представлений? - PullRequest
1 голос
/ 13 января 2011

Я хочу несколько предложений по реализации этой функциональности с аккуратным дизайном и без какой-либо репликации кода. У меня есть приложение со многими представлениями и контролем сетки в большинстве представлений. Мне нужно добавить функциональность экспорта (экспортировать записи в Excel). Элемент управления grid поддерживает эту OOB, просто нужно вызвать Grid.Export (). Я планирую кнопку пользовательского интерфейса на каждой сетке и вызываю этот метод.

Итак, очевидно, что мне нужно писать код только с выделенным кодом, поскольку мне нужен экземпляр элемента управления для вызова метода. Но мне нравится хранить код в одном месте и каким-то образом вызывать код из всех Xamls. (все просмотры WPF).

Один из методов - написать класс BaseView и извлечь из него все виды.

Но хотелось бы знать, поддерживает ли WPF какие-либо методы, с помощью которых я могу этого достичь. (поведение и т.д ..?)

Спасибо, Mani

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Создайте UserControl, который включает в себя как сетку данных, так и кнопку экспорта.По сути, сделайте это частью самой сетки.

Используйте эту UserControl вместо сетки данных по умолчанию во всех ваших представлениях, и все готово.

Более того, если вы когда-либоВы должны изменить внешний вид вашей кнопки или ее поведение, у вас есть только одно место, где вы можете изменить ее, и она будет обновлена ​​во всех ваших видах.

0 голосов
/ 14 января 2011

Одним из решений является использование перенаправленной команды WPF.

Примечание. Я написал этот ответ с предположением, что ваше "Представление" является подклассом класса Window.

Сначала добавьте настраиваемую маршрутизируемую команду в ваш проект.

public static class MyCommands
{
    private static readonly RoutedUICommand exportCommand = new RoutedUICommand("description", "Export", typeof(MyCommands));

    public static RoutedUICommand ExportCommand
    {
        get
        {
            return exportCommand;
        }
    }
}

В каждом представлении установите настраиваемую команду для Button.Command и привяжите целевой объект к Button.CommandTarget.

<Button Command="local:MyCommands.ExportCommand" CommandTarget="{Binding ElementName=dataGrid1}">Export</Button>

Фирменно, в вашем классе Application (по умолчанию называемом App) зарегистрируйте привязку команды между вашей пользовательской командой и Window.

public partial class App : Application
{
    public App()
    {
        var binding = new CommandBinding(MyCommands.ExportCommand, Export, CanExport);
        CommandManager.RegisterClassCommandBinding(typeof(Window), binding);
    }

    private void Export(object sender, ExecutedRoutedEventArgs e)
    {
        // e.Source refers to the object is bound to Button.CommandTarget.
        var dataGrid = (DataGrid)e.Source;

        // Export data.
    }

    private void CanExport(object sender, CanExecuteRoutedEventArgs e)
    {
        // Assign true to e.CanExecute if your application can export data.
        e.CanExecute = true;
    }
}

Теперь App.Export вызывается, когда пользователь нажимает кнопку.

Образец доступен здесь .

...