Привязка к методу с доступом к локальным переменным - PullRequest
0 голосов
/ 12 марта 2012

Я какое-то время играл с WPF, и мне нравится, как он чрезвычайно универсален. Я прочитал, как привязать метод к одному параметру (используя конвертер). Однако, чисто гипотетически, есть ли способ привязки к функции, которая имеет доступ к локальным переменным в классе?

Например, скажем, у меня есть ListBox из TextBox, который должен быть связан со списком строк, которые определены и обрабатываются в коде позади, через DataTemplate. Однако вместо отображения всей строки каждый TextBox отображает только первые N слов соответствующей строки, что легко сделать с помощью метода, который принимает строку и N в качестве параметров. Однако пользователь N может свободно настраивать его и, следовательно, должен быть локальной переменной. Чтобы это было гибким элементом управления, N не может быть статической переменной, так как мы хотим, чтобы было возможно иметь много окон с такими ListBoxes с разными N; кроме того, это было бы крайне не элегантно.

Теперь мы не можем использовать конвертер, так как конвертеры принимают только одну переменную, в то время как нам нужен доступ к N. Мы не можем обманывать и использовать статическую переменную.

Мы также не можем привязать TextBox к локальному свойству, которое имеет доступ к локальным переменным, как мы делаем с обычными объектами, так как мы привязываем к целому списку объектов.

Из того, что я вижу, ObjectDataProvider позволяет вам вызывать только метод класса данного объекта, но не метод, определенный в окне. Я считаю, что создавать новый класс и копировать N во все экземпляры класса просто ради достижения такой простой функциональности.

Конечно, в реальном сценарии можно обойти эту проблему с помощью таких мер, как создание объекта, включающего строку и N, как в предыдущем абзаце, или включение как строки, так и другой строки, содержащей первые два слова предварительно вычисленной строки , Я просто спрашиваю, существует ли такая функциональность для WPF, потому что она хорошо вписывается в концепцию, на которой основан WPF, и я считаю, что такая функциональность так или иначе будет полезна.

Извините, если решение сразу очевидно; Я искал часы.

Если есть решение, есть ли способ сделать это полностью в XAML, используя только метод, определенный в коде?

РЕДАКТИРОВАТЬ: Большое спасибо за предложение, Клеменс ... N не может быть передан как ConvertParameter, так как невозможно связать с ConvertParameter. Что касается первого предложения, я его пробую, но получаю ошибку Specified cast is not valid. в методе Convert IMultiValueConverter. Вместо N значения [1] - это DependencyProperty.UnsetValue. Ниже приведен код:

1020 * XAML *

<MultiBinding>
    <MultiBinding.Converter>
        <my:StringShorternerConverter />
    </MultiBinding.Converter>
    <Binding Path="Title" />
    <Binding ElementName="me" Path="N" />
</MultiBinding>

Внутри StringShorternerConverter

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return ShortenText((String)values[0], (Int32)values[1]);
}

РЕДАКТИРОВАТЬ 2: Похоже, что эта ошибка была из-за какой-то несоответствующей ошибки. Да, это работает. Большое спасибо.

1 Ответ

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

Вы можете легко привязать к нескольким свойствам, используя MultiBinding в сочетании с конвертером, который реализует IMultiValueConverter .

Вы также можете передать свою переменную N в аргумент parameter метода Convert обычного преобразователя с помощью свойства Binding.ConverterParameter .

...