Я какое-то время играл с 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: Похоже, что эта ошибка была из-за какой-то несоответствующей ошибки. Да, это работает. Большое спасибо.