0

我有两个对象,文化和翻译,它们都不复杂。Culture 就像一个简单的 CultureInfo,但有一个额外的字段。文化可能不会经常改变,而且一开始也不会有很多。但是,会有很多 Translations,每个 Translations 都有一个 CultureID 属性。每个翻译都有一个 TranslationID,以便您可以将翻译链接在一起。数据看起来像这样:

TranslationID、 CultureID、文本;
1、 ,你好;
1, es , 你好;
2、 ,再见;
2、 es,再见;

我正在尝试构建一个控件,我可以在其中绑定文化列表和翻译列表。对于每个 TranslationID,可能不是每个 Culture 都有一个 Translation。所以我可能有英文、西班牙文、德文和中文作为我的文化,但对于“你好吗”,我可能只有英文和德文的翻译。

相同 TranslationID 的翻译列表将绑定到控件。在控件内部,每种文化只有一个或零个翻译。我有一个扩展器元素的 xaml 列表框。每个 Expander 应该有一个 Culture,其中 Culture.Name 属性作为标题。每个扩展器的内容是一个包含该文化翻译的文本框,如果翻译存在的话。如果它不存在,则 TextBox 为空白。到目前为止,我已经完成了这么多工作。

在控件之外,可以选择其中一种文化来编辑翻译,即使在控件内可以编辑文化的任何翻译。如果发生这种情况就好了。当前编辑文化应该做的是使包含该文化的控件中的扩展器成为打开控件时唯一扩展的控件(控件将在弹出窗口中)。不应展开控件中列表框中的所有其他扩展器。我在控件中创建了一个依赖属性,它采用当前的编辑文化,称为 CurrentTranslationCulture。

这就是我的问题所在。我尝试使用 DataTrigger 和自定义转换器将 Culture 与 CurrentTranslationCulture 进行比较。但是,由于转换器是它自己的类,它无权访问 CurrentTranslationCulture。我尝试将它作为 ConverterParameter 传递,但我无法将它绑定到 DataTrigger 绑定中的 ConverterParamater 参数。我什至不知道这是否是我应该采取的方法。有谁知道这个问题的解决方案,或者甚至是更好的解决方案?提前致谢。

代码:下面的代码不能完全工作。如果您取出 ConverterParameter,它会起作用,但我的所有扩展器都会被关闭。在 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 来捕获绑定到扩展器的 Culture 以及 CurrentTranslationCulture。然后将两者传递到应用适当逻辑的转换器中。

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 回答