Предоставить свойство зависимости элемента управления для преобразователя в элементе управления? - PullRequest
0 голосов
/ 18 мая 2010

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

TranslationID, CultureID , Текст;
1, ru , Hello;
1, es , Hola;
2, ru , пока;
2 es , Adios;

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

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

Вне элемента управления одна из культур может быть выбрана для редактирования переводов, хотя внутри элемента управления можно редактировать любой перевод культуры. Хорошо, если это произойдет. То, что должна сделать текущая культура редактирования, - это сделать Expander в моем элементе управления, который содержит эту самую Культуру, быть единственным, который будет расширен, когда элемент управления открыт (элемент управления будет во всплывающем окне). Все остальные расширители в списке в элементе управления не должны быть развернуты. В моем элементе управления есть свойство зависимости, которое принимает текущую культуру редактирования, которая называется CurrentTranslationCulture.

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

Код: приведенный ниже код не работает полностью. Если вы уберете ConverterParameter, он будет работать, но все мои расширители будут закрыты. ElementName = labelTranslationEditor внутри ConverterParamerter - это имя, которое я предоставил своему элементу управления, пытаясь получить к нему доступ.

<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 голосов
/ 19 мая 2010

Из форума MSDN ... Решением проблемы Expander было использование 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>
...