2012-04-04 3 views
1

Хорошо, я довольно новичок в XAML & WPF, поэтому я пытаюсь создать учебный проект для создания периодической таблицы. У меня есть набор элементарных данных в XML. Я определил шаблон элемента управления в XAML, чтобы отобразить эту информацию для каждого химического элемента в виде кнопки в сетке:XAML Databinding в шаблонах управления с помощью динамического выражения Xpath

<ControlTemplate x:Key="elementTemplate" TargetType="{x:Type Button}"> 
      <Grid> 
       <Rectangle x:Name="backingRect" Margin="2" StrokeThickness="0" RadiusX="3" RadiusY="3" Fill="{TemplateBinding Property=Button.Background}"> 
        <Rectangle.Effect> 
         <DropShadowEffect BlurRadius="8"/> 
        </Rectangle.Effect> 

       </Rectangle> 
       <Viewbox> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="0.2*"/> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="0.2*"/> 
         </Grid.RowDefinitions> 
         <TextBlock FontWeight="DemiBold" TextAlignment="Center" Grid.Row="0" diag:PresentationTraceSources.TraceLevel="High"> 
          <TextBlock.Text> 
           <Binding Source="{StaticResource elementData}"> 

            <Binding.XPath>atom[@id='H']/scalar[@dictRef='bo:atomicNumber']</Binding.XPath> 
           </Binding> 
          </TextBlock.Text> 
         </TextBlock> 
         <TextBlock FontWeight="Bold" TextAlignment="Center" FontSize="28" Grid.Row="1" > 
          <TextBlock.Text> 
           <Binding Source="{StaticResource elementData}" > 

            <Binding.XPath>atom[@id='H']/label[@dictRef='bo:symbol']/@value</Binding.XPath> 
           </Binding> 
          </TextBlock.Text></TextBlock > 
         <TextBlock FontWeight="DemiBold" TextAlignment="Center" Grid.Row="2">1.0021</TextBlock> 
        </Grid> 
       </Viewbox> 
      </Grid>    
</ControlTemplate> 

Теперь, это создаст кнопку, которая связывается с моим исходными данными XML статический. Я хочу сделать замену критерия XPath выражением, которое извлекает содержимое кнопки, которая использует этот шаблон, например @id={TemplateBinding Button.Content} (если такая возможность была возможна), поэтому, если я создаю такую ​​кнопку с текстовым содержимым «Он», он будет извлекать соответствующие данные в XML-файле, такие как масса, атомный номер и т. Д. Что такое синтаксис для указания такого динамического XPath в XAML и привязка его к свойству в шаблоне управления?

ответ

1

См http://www.codeproject.com/Articles/854564/Parameterized-XPaths-in-XAML для более полного обсуждения, ...

По существу, вы должны использовать мульти-связывание с несколькими связывающего конвертер, который выполняет параметризированную замену пути, как связывание строятся, а затем вернуть нужное содержимое ,

E.g. 
<MultiBinding Converter="{StaticResource XPathConverter}" ConverterParameter="atom[@id=&quot;{1}&quot;]/scalar[@dictRef='bo:atomicNumber']" Mode="OneWay"> 
    <Binding Source="{StaticResource elementData}" Mode="OneWay" /> 
    <Binding ElementName="_Button" Path="Content" Mode="OneWay"/> 
</MultiBinding> 

Если вам нужна только привязка OneWay, конвертер прост. ConverterParamenter - это XPath с параметризованным заполнителем (-ами). Первая привязка к вашим данным XML. И вторая привязка - для ваших управляющих данных, которые будут использоваться для параметризованной замены. Вам нужно будет скорректировать преобразователь ниже для ваших конкретных объектов данных и вашего желаемого возвращаемого значения.

public class XPathConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     XmlNode root = (value[0] as XmlNode); 
     string xpathf = (parameter as string); 
     for (int i = 1; i < values.Count(); i++) 
      xpathf = xpathf.Replace("{" + i.ToString().Trim() + "}", values[i] as string ?? ""); 

     return root.SelectSingleNode(xpathf).InnerXML; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Благодарим за ваш ответ, через год! Я отдам его. – deadlyvices

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