2012-04-04 9 views
1

私はXAML & WPFの新機能ですので、定期的なテーブルを作成する学習プロジェクトを試しています。私はXMLで要素データのセットを持っています。さて、これは静的に私の基本となるXMLデータにバインドするボタンを作成しますXAML動的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> 

:私は、グリッド内のボタンとして各化学要素のために、この情報を表示するには、XAMLでコントロールテンプレートを定義しています。私がしたいのは、@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データです。第2のバインディングは、制御データをパラメータ化された置換に使用することです。あなたはあなたの特定のデータオブジェクトとあなたの希望する戻り値のために、以下のコンバータを修正する必要があります。

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

1年後にあなたの答えをありがとう!私はそれを行ってあげるよ。 – deadlyvices

関連する問題