1

わかりました、私は XAML と WPF にかなり慣れていないので、周期表を構築するための学習プロジェクトを試みています。XML の要素データのセットがあります。XAML でコントロール テンプレートを定義して、各化学元素の情報をグリッド内のボタンとして表示します。

 <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 データに静的にバインドするボタンが作成されます。私がやりたいことは、@id='H'XPath 基準を、このテンプレートを使用するボタンのコンテンツを取得する式@id={TemplateBinding Button.Content}(そのようなことが可能であれば)に置き換えることです。 '、それは質量、原子番号などの XML ファイル内の対応するデータを取得します。このような動的 XPath を XAML で指定し、それをコントロール テンプレートのプロパティにバインドするための構文は何ですか?

4

1 に答える 1

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();
    }   
}
于 2016-01-24T06:09:27.407 に答える