0

Culture と Translation の 2 つのオブジェクトがありますが、どちらも複雑ではありません。Culture は単純な CultureInfo に似ていますが、追加のフィールドがあります。文化は頻繁に変わることはなく、最初から多くはないでしょう。ただし、多数の Translation が存在し、各 Translation には CultureID プロパティがあります。各翻訳には TranslationID があるため、翻訳をリンクすることができます。データは次のようになります。

TranslationID、 CultureID、テキスト;
1, en , こんにちは;
1、 es、Hola;
2, en , さようなら;
2、 es、アディオス。

Cultures のリストと Translations のリストをバインドできるコントロールを作成しようとしています。TranslationID ごとに、すべての Culture の Translation があるとは限りません。だから私は私の文化として英語、スペイン語、ドイツ語、中国語を持っているかもしれませんが、「お元気ですか」については英語とドイツ語の翻訳しか持っていないかもしれません.

同じ TranslationID の Translations のリストがコントロールにバインドされます。コントロール内では、カルチャごとに 1 つまたは 0 つの翻訳しかありません。Expander 要素の xaml Listbox があります。各 Expander には、Culture.Name プロパティをヘッダーとして持つ 1 つの Culture が必要です。Translation が存在する場合、各 Expander のコンテンツは、その Culture の Translation を含む TextBox です。存在しない場合、TextBox は空白です。これまでのところ、私はこれだけの作業をしています。

コントロール内では文化の翻訳を編集できますが、コントロールの外では翻訳を編集するために文化の 1 つを選択できます。そうなったらいいですよね。現在編集中のカルチャが行うべきことは、そのカルチャを含むコントロール内のエキスパンダーを、コントロールを開いたときに展開される唯一のものにすることです (コントロールはポップアップになります)。コントロールのリストボックス内の他のすべての Expanders は展開しないでください。CurrentTranslationCulture と呼ばれる、現在の編集カルチャを取得する依存関係プロパティをコントロールに作成しました。

ここに私の問題があります。DataTrigger とカスタム コンバーターを使用して、Culture と CurrentTranslationCulture を比較してみました。ただし、コンバーターは独自のクラスであるため、CurrentTranslationCulture にはアクセスできません。ConverterParameter として渡そうとしましたが、DataTrigger の Binding で ConverterParamater パラメーターにバインドできませんでした。これが私が取るべきアプローチであるかどうかさえわかりません。誰かがこれに対する解決策を知っていますか、それとももっと良い解決策を知っていますか? 前もって感謝します。

コード: 以下のコードは完全には機能しません。ConverterParameter を取り出すと機能しますが、すべての Expanders が閉じられます。ConverterParamerter 内の ElementName=labelTranslationEditor は、アクセスしようとしてコントロールに付けた名前です。

<ListBox x:Name="listTranslations" AlternationCount="2">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type office:Culture}">
                        <Expander x:Name="cultureExpander" Header="{Binding Path=Name}" IsExpanded="False">
                            <Expander.Triggers>

                            </Expander.Triggers>
                            <TextBox x:Name="tbInsertLabelText" Style="{StaticResource popupLabelTextBox}" MinWidth="300" MaxWidth="450"
                                VerticalAlignment="Top" HorizontalAlignment="Right" SpellCheck.IsEnabled="True" TextWrapping="WrapWithOverflow" />
                        </Expander>

                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding Path=CultureID, Converter={StaticResource expandedConverter}, ConverterParameter={Binding ElementName=labelTranslationEditor, Path=CurrentTranslationCulture}}" Value="false">
                                <Setter TargetName="cultureExpander" Property="IsExpanded" Value="false" />
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ListBox.ItemTemplate>
4

1 に答える 1

0

MSDN フォーラムから... Expander の問題の解決策は、MultiBinding を使用して、Expander にバインドされている Culture と CurrentTranslationCulture の両方をキャプチャすることでした。この 2 つは、適切なロジックを適用する Converter に渡されます。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/2699e07e-5eff-4499-8aec-34f6e1e298a0

変更された唯一のコードは次のとおりです。

<DataTemplate.Triggers>
                            <DataTrigger Value="True">
                                <DataTrigger.Binding>
                                    <MultiBinding Converter="{StaticResource expandedConverter}">
                                        <Binding Path="CultureID" />
                                        <Binding ElementName="labelTranslationEditor" Path="CurrentTranslationCulture" />
                                    </MultiBinding>
                                </DataTrigger.Binding>
                                <Setter TargetName="cultureExpander" Property="IsExpanded" Value="True" />
                            </DataTrigger>
                        </DataTemplate.Triggers>
于 2010-05-18T21:21:54.007 に答える