Насколько гибка привязка данных в WPF? - PullRequest
5 голосов
/ 27 февраля 2011

Насколько гибка привязка данных в WPF?Я новичок в WPF и хотел бы иметь четкую идею.Могу ли я связать строковую переменную со значением Slider?Всегда ли это должен быть элемент управления?

Можно ли вообще связать строковое значение с элементом управления Slider, чтобы он обновлялся в реальном времени?Как далеко вверх по Логическому дереву проходит обновление, или нам нужно повторно ввести все команды, чтобы использовать это новое значение?

Это был мой спешный вопрос ранее.Я публикую детальную проблему.

Я пытаюсь сделать следующее: у меня есть приложение с несколькими пользовательскими элементами управления.Эти пользовательские элементы управления являются сеточными представлениями и содержат элементы управления (TextBox, Button) и разделы пользовательского интерфейса моего приложения.Я использовал этот подход, чтобы разделить мой основной файл XAML на несколько файлов, и он работает для меня до сих пор.Теперь у меня есть Slider в одном пользовательском элементе управления, и я хочу связать переменную String в другом пользовательском элементе управления.Строковая переменная доступна только для чтения, поэтому для двухстороннего связывания нет смысла.

Надеюсь, это прояснит мой вопрос.В моем коде я пытаюсь обновить переменную zoomFactor в:

URLQuery.Append("&zoom=" + zoomFactor + "&size=600x500&format=jpg&sensor=false");

с помощью элемента управления Slider.Для тех, кто это заметил, да, это API Статических Карт Google, и да, я пытаюсь увеличить карту с помощью ползунка.

Ответы [ 4 ]

4 голосов
/ 27 февраля 2011

Обычно вы можете делать такие вещи, используя IValueConverter.

Когда вы создаете правильный конвертер, вы можете указать, использовать ли его для привязки в XAML.

Для части «в реальном времени», если вы правильно реализуете INotifyPropertyChanged в своем объекте DataContext, изменение переменной будет отражено в пользовательском интерфейсе с применением всех преобразователей значений, которые вы решили.ползунок, как вы сказали:

<Window x:Class="Example.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Example"
        Title="MainWindow" Height="350" Width="525"
        >
    <Window.Resources>
        <local:HMLConverter x:Key="hiloConverter"></local:HMLConverter>
    </Window.Resources>
    <Slider Value="{Binding MyValue, Converter={StaticResource hiloConverter}}"  Maximum="100" Minimum="0"/>
</Window>

Я создал небольшой конвертер, названный HMLConverter, который сопоставляет строковую переменную со значением 0-50-100 для соответствующих "lo", "med", ang "привет "струны.Конвертер объявлен как статический ресурс и используется в привязке.Код конвертера выглядит следующим образом:

namespace Example
{
    public class HMLConverter:IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string val = value.ToString();
            int ret = 0;
            switch (val.ToLower())
            {
                case "hi":
                    ret = 100;
                    break;
                case "lo":
                    ret = 0;
                    break;
                case "med":
                    ret=50;
                    break;
                default:
                    throw new NotSupportedException("Value " + val + " is not supported");
            }
            return ret;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

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

1 голос
/ 27 февраля 2011

Как только вы изучите ограничения, система связывания WPF станет достаточно гибкой.

Любой тип может быть связан с любым другим типом.Если типы не имеют явного преобразования, вы можете использовать IValueConverter для преобразования из одного типа в другой.

Ограничения, которые я обнаружил до сих пор:

  • Невозможно привязать к методу.Связывание может происходить только между свойствами.

  • Вы можете связать только DependencyProperties на элементах управления.Большинство свойств DependencyProperties, но иногда это не так, что может разочаровать.

  • Все может стать сложным, когда элементы DataContext установлены WPF, а дочерний элемент хочет получить доступк оригиналу DataContext.Например, в ListBox для каждого элемента DataContext устанавливается элемент в ListBox.Поэтому, если вы хотите DataContext из ListBox, вам нужно прыгнуть через несколько обручей.

  • Другая проблема с привязкой связана с элементами, которые не являются частью визуального дерева, например ContextMenus.Подобно элементам в ListBox, вы должны перепрыгнуть через несколько обручей, чтобы заставить их работать должным образом.

Большинство людей реализуют INotifyPropertyChanged, чтобы позволить WPF отслеживать изменения в ихсвязанные объекты.Но вы также можете использовать DependencyProperties, если ваш объект наследует от DependencyObject.

1 голос
/ 27 февраля 2011

Привязка данных в WPF намного лучше, чем привязка данных в Winforms, если это то, о чем вы спрашиваете?беспокоиться о том, что скорее всего просто работать.

1 голос
/ 27 февраля 2011

насколько гибкий?настолько гибкая, что ни разу не подвела меня.

Вы можете делать практически все с привязками WPF.Вы можете привязать двойные значения к строкам с помощью конвертеров.Вы можете получить значение из нескольких привязок (MultiBinding).Вам не нужно беспокоиться о распространении изменений.

Поскольку это звучит как решение за / против использования WPF в зависимости от способности связывания, не беспокойтесь!Вы можете сделать что угодно!

Если у вас есть конкретная проблема, пожалуйста, оставьте конкретный вопрос.

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