2015-04-21 3 views
0

Я использую ленту Actipro в своем приложении и использую способ, которым можно интегрировать заголовок документа с заголовком главной ленты, когда стандартный хост mdi (стыковка - это док-станция Actipro). Теперь, пока я использую элементы управления конкретного поставщика, я думаю/надеюсь, что мой вопрос немного более общий.Есть ли способ ссылаться на привязку в коде позади

В настоящее время Xaml, предоставляющий эту функциональность, отмечен таким образом.

<ribbon:RibbonWindow.DocumentName> 
    <MultiBinding Converter="{StaticResource ConditionalConverter}"> 
     <Binding ElementName="window" Path="IsMDIChildMaximized" /> 
     <Binding ElementName="standardMdiHost" Path="PrimaryWindow.Title" /> 
     <Binding Source="{x:Null}" /> 
    </MultiBinding> 
</ribbon:RibbonWindow.DocumentName> 

Сама лента называется так в коде позади, я могу написать что-то вдоль линий;

MainRibbonWindow.DocumentName 

Однако я не могу добраться до MultiBinding. Очень конкретно я хотел бы найти способ динамически устанавливать ELEMENTNAME на второй линии привязки в XAML

<Binding ElementName="standardMdiHost" Path="PrimaryWindow.Title" /> 

, потому что я знаю, что фактическая standardmdihost, что в настоящее время refered чтобы изменится (все остальное останется одна и та же).

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

Я столкнулся с сообщением this, но я не уверен, действительно ли это ответ, и даже если бы я решил применить его в этой ситуации.

Большое спасибо

EDIT

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

Dim binding As New MultiBinding() With {.Converter = New BooleanAndConverter()} 
    binding.Bindings.Add(New Binding("AreWindowsMaximized") With {.Source = host}) 
    binding.Bindings.Add(New Binding("HasItems") With {.Source = host}) 
    Me.SetBinding(IsMDIChildMaximizedProperty, binding) 

Однако предварительные предпринимались попытки

Dim binding2 As New MultiBinding() With {.Converter = New ConditionalConverter()} 
    binding2.Bindings.Add(New Binding("Binding1") with {.ElementName = "MainRibbonWindow", .Path = IsMDIChildMaximized} 

не идут так, как ожидалось. Если кто-то может помешать догадаться о том, что может работать, я буду очень благодарен.

ответ

0

У вас будет больше удачи по данным, привязанным к объекту DocumentName к собственности в вашей модели. Таким образом, вы можете генерировать значение в коде ... возможно что-то вроде этого:

В XAML:

<ribbon:RibbonWindow DocumentName="{Binding DocumentName, Mode=OneWay}" ... /> 

В коде:

public string DocumentName 
{ 
    get { return string.Format("{0}{1}", Value1, Value2); } 
} 

private string Value1 
{ 
    get { return value1; } 
    set { value1 = value; NotifyPropertyChanged("DocumentName"); 
} 

private string Value2 
{ 
    get { return value2; } 
    set { value2 = value; NotifyPropertyChanged("DocumentName"); 
} 

Тогда вам просто нужно установить Value1 идо любых значений, которые вам нужны, и они будут обновлять DocumentName с использованием интерфейса INotifyPropertyChanged (или, точнее, интерфейс INotifyPropertyChanged будет уведомлять пользовательский интерфейс об изменении DocumentName, а затем получить последнее значение).

+0

Большое спасибо за ваше предложение. В конце (я должен признать некоторую большую поддержку со стороны людей в Actipro, мы придумали код, который я добавил в ответ чуть ниже этого –

0

На всякий случай кто-то должен споткнуться об этом и иметь аналогичную проблему.Моя первоначальная ошибка заключалась в неправильном понимании того, как работает синтаксис привязок и что все ключи, необходимые для этого, были уже в xaml, который я искал для удаления и замены wit-кода.

Конечный результат (который действительно работает) оказался;

Dim binding2 As New MultiBinding() With {.Converter = New ConditionalConverter()} 
    binding2.Bindings.Add(New Binding("IsMDIChildMaximized") With {.Source = MainRibbonWindow}) 
    binding2.Bindings.Add(New Binding("PrimaryWindow.Title") With {.Source = host}) 
    SetBinding(DocumentNameProperty, binding2) 

Это был очень конкретный вопрос, вовлекая ленты и стыковки ommands Actipro и два источника (MainRibbonWindow и хост) являются главное окно, название которого мы пытаемся интегрировать с этим из окна документа и standardMdiHost сам.

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

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