Wpf: Где вы храните вспомогательные классы, используемые в привязанных свойствах? - PullRequest
1 голос
/ 02 ноября 2010

Я хотел использовать привязку данных с ToolBarTray, поэтому я создал несколько сервисов и привязал свойства для полного удовлетворения моих потребностей.Окончательное решение было следующим:

    <ToolBarTray local:TrayBinding.ItemsSource="{Binding Path=Groups}" 
                 local:TrayBinding.ToolBarItemsSource="Items"></ToolBarTray>

Где ItemsSource ссылается на коллекцию, используемую для создания панелей инструментов, а ToolBarItemsSource ссылается на свойство элемента, привязанного к панели инструментов, которое будет использоваться в качестве ItemsSource на панели инструментов.,Теперь все работает нормально, но прежде чем я спрыгну и введу это в рабочий код, я хочу убедиться, что я не делаю глупостей.

Итак, логика работает следующим образом: класс TrayBinding инициализируетКласс ToolBarTrayBinder (это класс, который выполняет фактическую работу по созданию панелей инструментов в трее и поддерживает их синхронизацию с коллекцией с привязкой к данным) и назначает его для ToolBarTray, для которого определены привязанные свойства.Так как мне нужно сохранить отображение между каждым ToolBarTray и его соответствующим ToolBarTrayBinder, я решил добавить ToolBarTrayBinder в качестве свойства зависимостей на ToolBarTray.Ниже вы можете увидеть логику инициализации в классе TrayBindig:

    private static void InitializeBinder(ToolBarTray tray)
    {
        string toolsItemsSource = GetToolBarItemsSource(tray);
        IEnumerable dataSource = GetItemsSource(tray);

        if (string.IsNullOrEmpty(toolsItemsSource) || dataSource == null)
            return;

        var toolBarTrayBinder = tray.GetValue(BindingServiceProperty) as ToolBarTrayBinder;

        if (toolBarTrayBinder == null)
        {
            toolBarTrayBinder = new ToolBarTrayBinder(tray);
            tray.SetValue(BindingServiceProperty, toolBarTrayBinder);
        }

        toolBarTrayBinder.ItemsSource = toolsItemsSource;
        toolBarTrayBinder.DataSource = dataSource;
    }

И ToolBarTrayBinder хранится в частном свойстве зависимости:

    private static readonly DependencyProperty BindingServiceProperty = DependencyProperty.Register("TrayBinder",
                                                                                   typeof(ToolBarTrayBinder),
                                                                                   typeof(ToolBarTray),
                                                                                   new PropertyMetadata(null));

Итак, мой вопрос: считается ли онКак добавить вспомогательные классы, такие как ToolBarTrayBinder, в качестве свойства зависимости для элемента, к которому присоединено свойство?Есть ли какие-либо проблемы, такие как утечки памяти или аналогичные, которые могут вызвать проблемы при этом?

1 Ответ

1 голос
/ 02 ноября 2010

Я не вижу проблемы с этим, хотя это немного тяжеловесно для простого связывания данных (вы только связываете данные, а не используете привязку данных или уведомление об обновлении.) простой кэш Словаря, но использование DP дает вам преимущество удаления DP, если ToolBarTray исчезает (поскольку DependencyObject предоставляет хранилище).

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