У меня есть два объекта, Культура и Перевод, ни один из которых не является сложным. Культура похожа на простую 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>