2013-06-18 3 views
2

Есть ли способ превратить строку, содержащую привязывающее выражение, в объект Binding?WPF parse binding expression

Простой пример будет "{Binding Path}",

или:

"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=views:IPage}, Path=TensileTestChange}"

Фактическое связывание выражение хранится в XML, который представляет собой представление более высокого уровня из XAML документа.

+0

Вы можете посмотреть в [ 'Binding' конструктор, который принимает строку] (http://msdn.microsoft.com/en-us/library/ms597578.aspx) –

+0

Hi @Trustme -I'maDoctor, я расширил другой пример, который мне нужно реализовать. – Darkzaelus

+0

Я никогда раньше не использовал необработанные «привязки», поэтому лучшее, что я лично могу сделать, это просто обратиться к ['Binding'] (http://msdn.microsoft.com/en-us/library/ms617928.aspx), который содержит все необходимые вам свойства - на самом деле это одно и то же обязательство, которое используется в XAML. Я не знаю, можете ли вы как-то передать ему предопределенную строку, или если вам придется сначала разбирать строку (что было бы контрпродуктивным). –

ответ

3

Что вы просите, так это разобрать MarkupExtension. Я не смог найти реализацию WPF напрямую (она содержится где-то в цепочке вызовов XamlReader.Parse).

После некоторых поисковых запросов, похоже, для этого нет готового решения. Однако, если у вас есть опыт написания парсеров, вы можете опрокинуть свои собственные. Спецификация для разбора MarkupExtension дается на MSDN.

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

string myBindingExpression = "{Binding MyProperty}"; 

var test = "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Text=\"" 
    + myBindingExpression + "\" />"; 
var result = XamlReader.Parse(test) as TextBlock; 
var bindingExpression = result.GetBindingExpression(TextBlock.TextProperty); 

Binding binding = bindingExpression.ParentBinding 

Это создает TextBlock с связывания как свойство Text. Он даст вам объект привязки со свойствами, установленными в соответствии с выражением привязки.

Затем вы можете применить привязку везде.

Помните, что для вашего более сложного примера с префиксом xmlns вам необходимо включить xmlns:views="..." в подделку TextBlock, иначе он не будет знать, что делать с префиксом.

Пример: <TextBlock xmlns:views="..." xmlns="..." Text="{Binding MyProperty}" />

+0

Спасибо Bas, хорошо известно, что это называется MarkupExtension, я не мог найти правильный термин для этого! Я буду иметь в виду комментарий о xmlns, спасибо, спасибо! – Darkzaelus