Предоставить свойство зависимости элемента управления преобразователю в элементе управления?

У меня есть два объекта, Культура и Перевод, ни один из которых не является сложным. Культура похожа на простую CultureInfo, но с дополнительным полем. Культуры, скорее всего, не будут часто меняться, и для начала их будет немного. Однако переводов будет много, и у каждого перевода есть свойство CultureID. У каждого перевода есть TranslationID, так что вы можете связать переводы вместе. Данные будут выглядеть примерно так:

TranslationID, CultureID, Text;
1, en, Hello;
1, es, Hola;
2, ru, Пока;
2, es, Adios;

Я пытаюсь создать элемент управления, в котором я могу связать список культур, а также список переводов. Для каждого TranslationID не может быть перевода для каждой культуры. Таким образом, у меня могут быть английский, испанский, немецкий и китайский языки в качестве культур, но для «Как дела» у меня могут быть только английский и немецкий переводы.

Список переводов с одним и тем же идентификатором перевода будет привязан к элементу управления. Внутри элемента управления будет только один или ноль переводов на культуру. У меня есть xaml Listbox элементов Expander. Каждый Expander должен иметь одну культуру со свойством Culture.Name в качестве заголовка. Содержимое каждого расширителя представляет собой текстовое поле, содержащее перевод этой культуры, если перевод существует. Если он не существует, TextBox пуст. До сих пор у меня так много работы.

Вне элемента управления можно выбрать одну из культур для редактирования переводов, хотя внутри элемента управления можно редактировать любой перевод культуры. Это нормально, если это произойдет. Что должна сделать текущая культура редактирования, так это сделать Expander в моем элементе управления, который содержит эту самую культуру, единственным, который расширяется при открытии элемента управления (элемент управления будет во всплывающем окне). Все остальные расширители в списке в элементе управления не должны быть развернуты. Я создал свойство зависимости в своем элементе управления, которое принимает текущую культуру редактирования, называемую CurrentTranslationCulture.

Вот в чем моя проблема. Я попытался использовать DataTrigger и пользовательский преобразователь, чтобы сравнить культуру с CurrentTranslationCulture. Однако, поскольку преобразователь является собственным классом, он не имеет доступа к CurrentTranslationCulture. Я попытался передать его как ConverterParameter, но не смог связать его с параметром ConverterParamater в привязке DataTrigger. Я даже не знаю, следует ли мне придерживаться такого подхода. Кто-нибудь знает решение этой проблемы или, возможно, даже лучшее? Заранее спасибо.

Код: приведенный ниже код работает не полностью. Если убрать 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>

person JoeSharp    schedule 18.05.2010    source источник
comment
Зачем пытаться заново изобретать глобализацию? msdn.microsoft.com/en-us/library/ms788718.aspx   -  person    schedule 18.05.2010
comment
Мы используем глобализацию в статических частях приложения, таких как меню панели инструментов. Это для наших данных, управляемых базой данных, которые гораздо более динамичны и универсальны. Мне не ясны причины, это был не мой звонок. К сожалению, мне приходится с этим смириться.   -  person JoeSharp    schedule 18.05.2010


Ответы (1)


Из форума MSDN... Решение проблемы с расширителем заключалось в использовании MultiBinding для захвата как культуры, привязанной к расширителю, так и 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>
person JoeSharp    schedule 18.05.2010