为控件中的转换器提供控件的依赖属性?

时间:2010-05-18 14:32:12

标签: c# wpf data-binding converter datatrigger

我有两个对象,文化和翻译,两者都不复杂。文化就像一个简单的CultureInfo,但有一个额外的领域。文化可能不会经常改变,并且开始时不会有太多。但是,会有很多翻译,每个翻译都有一个CultureID属性。每个翻译都有一个TranslationID,因此您可以将翻译链接在一起。数据看起来像这样:

TranslationID, CultureID ,文字;
1, en ,你好;
1, es ,Hola;
2, en ,再见;
2, es ,Adios;

我正在尝试构建一个控件,我可以绑定文化列表以及翻译列表。对于每个TranslationID,可能没有针对每种文化的翻译。所以我可能会有英语,西班牙语,德语和中文作为我的文化,但对于“你好吗”,我可能只有英语和德语翻译。

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

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

这就是我的问题所在。我尝试使用DataTrigger和自定义转换器来比较Culture和CurrentTranslationCulture。但是,由于转换器是它自己的类,因此它无法访问CurrentTranslationCulture。我尝试将其作为ConverterParameter传递,但我无法将其绑定到DataTrigger的Binding中的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>

1 个答案:

答案 0 :(得分: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>