2015-02-06 3 views
0

Скажите, что у вас есть привязка данных в XAML, которая принимает в качестве примера экземпляр типа Apple и приводит к экземпляру типа Banana.Как объединить WPF DataBindings для повторного использования?

Интерфейс, который вы хотите использовать, занимает DataBinding, задачей которого является преобразование из Apple в Cherry. Очевидно, что это относительно простое преобразование из Banana в Cherry, поэтому вы решили создать вторую привязку данных в XAML, которая выполняет это преобразование до Cherry.

Теперь вы можете перейти от А к В и В к С, но как вы можете сцепить два, так что вы можете перейти в полноценный DataBinding, способный превращать Apple в Cherry?

Это не должно быть возможным в ванильном WPF, и я рад написать код. Я бы не удивился, например, если бы он вызвал что-то вроде класса ConcatenatedDataBinding с новым свойством для списка привязок входных данных.

Спасибо!

+0

То, что вы говорите, не очень понятно, но преобразования объект для чего-то другого НЕ является задачей представления (интерфейса). Если вы пытаетесь отобразить другой тип объекта в одном элементе управления, то то, что вы хотите, это DataTemplate. В зависимости от типа объекта ваши объекты могут отображаться по-разному. – Franck

ответ

0

Если вы хотите объединить несколько привязок данных для достижения определенной проекции, то используется MultiBinding, найденный в Xaml, который позволяет связывать многие объекты и через специализированный конвертер ( IMultiValueConverter) обеспечивает уникальный результат.

В противном случае, если у вас есть список разрозненных объектов, которые необходимо обрабатывать в одном привязке, использование хранилища Composite Collection может быть использовано для обработки объектов разных классов, но для обеспечения единственного результата.

0

Игнорирование точные DataContext ы и изменения свойств уведомления, ваше описание звучит что-то вроде:

public Apple Apple { get; set; } 
public Banana Banana { get; set; } 
public Cherry Cherry { get; set; } 

... 

void OnLoad() { 

    SetBinding(
    "Banana", 
    new Binding("Apple") { 
     Converter = (IValueConverter) FindResource("AppleToBananaConverter"), 
     Mode = BindingMode.OneWay 
    } 
); 

    SetBinding(
    "Cherry", 
    new Binding("Banana") { 
     Converter = (IValueConverter) FindResource("BananaToCherryConverter"), 
     Mode = BindingMode.OneWay 
    } 
); 

} 

В этом случае, я искренне считаю, самый простой ответ должен был бы создать AppleToCherryConverter. Вы можете переместить яблоко на банан и банан подпрограмм преобразования черри в одну общую папку для использования всеми тремя преобразователями таким образом, что вы повторно использовать код:

Apple Apple { get; set; } 
Cherry Cherry { get; set; } 

... 

void OnLoad() { 

    SetBinding(
    "Cherry", 
    new Binding("Apple") { 
     Converter = (IValueConverter) FindResource("AppleToCherryConverter"), 
     Mode = BindingMode.OneWay 
    } 
); 

} 
Смежные вопросы