0

コレクションの選択された値をコンボボックスにバインドすることの違いを誰かが私に説明できるかどうか疑問に思っています。

または、値をボタン コンテンツにバインドします。

そのように

<ComboBox x:Name="_culturedTitleViewModelSelector" Visibility="Hidden"  Style="{StaticResource ResourceKey=_culturedTitleViewModelSelectorStyle}"
            ItemsSource="{Binding Path=AvailableCultures, Source={x:Static Localized:ResourcesManager.Current}}"
            SelectedValue="{Binding Path=CurrentCulture, Source={x:Static Localized:ResourcesManager.Current}}"


<Button x:Name="LanguageBtn" Content="{Binding Path=CurrentCulture, Source={x:StaticLocalized:ResourcesManager.Current}}"

問題は、そこまで ComboBox を使用しない場合、別のクラスにある DependencyProperty が呼び出されないことです。

しかし、コンボボックスを使用するとすべてが機能します...コンボボックスは何もしませんが、それは単なる「回避策」です。ボタンをクリックするとCSコードでそれを行います:

        ResourcesManager.Current.SwitchToNextCulture();
        //We use a dummy comboBox to make sure the LanguageBehavior Property is being notified.
        _culturedTitleViewModelSelector.SelectedItem = ResourcesManager.Current.CurrentCulture;

そして、コンボボックスの SelectedItem を別のカルチャに設定しないと。languageBehavior クラスに通知されません。

:

public class LanguageBehavior
{
    public static DependencyProperty LanguageProperty =
        DependencyProperty.RegisterAttached("Language",
                                            typeof(string),
                                            typeof(LanguageBehavior),
                                            new UIPropertyMetadata(OnLanguageChanged));

    public static void SetLanguage(FrameworkElement target, string value)
    {
        target.SetValue(LanguageProperty, value);
    }
    public static string GetLanguage(FrameworkElement target)
    {
        return (string)target.GetValue(LanguageProperty);
    }

    private static void OnLanguageChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        var element = target as FrameworkElement;
        if (e.NewValue!=null)
        element.Language = XmlLanguage.GetLanguage(e.NewValue.ToString());
    }
}

ComboBox コンテンツはボタン コンテンツと同じように機能すると思います。

私の Generic.Xaml では、次のことを行います。

  <Style TargetType="{x:Type TextBlock}" x:Key="_textBlockLanguageProperty">
    <Setter Property="WpfServices:LanguageBehavior.Language" Value="{Binding Path=CurrentCulture, Source={x:Static Localized:ResourcesManager.Current}}" 
        />
</Style>

それがCurrentCultureです

  public CultureInfo CurrentCulture
    {
        get { return CultureProvider.Current; }
        set
        {
            if (value != CultureProvider.Current)
            {
                CultureProvider.Current = value;
                OnCultureChanged();
            }
        }
    }

現時点の :

    public static ResourcesManager Current
    {
        get
        {
            if (_resourcesManager == null)
            {
                var cultureProvider = new BaseCultureProvider();
                _resourcesManager = new ResourcesManager(cultureProvider);
                _resourcesManager.Init();
            }
            return _resourcesManager;
        }
    }

編集 :

私の _culturedTitelViewModelSelectorStyle は

 <Style TargetType="{x:Type ComboBox}" x:Key="_culturedTitleViewModelSelectorStyle">
    <Setter Property="DisplayMemberPath" Value="DisplayName" />
    <Setter Property="SelectedValuePath" Value="." />
    <Setter Property="HorizontalAlignment" Value="Right" />
    <Setter Property="MaxHeight" Value="40" />
    <Setter Property="FontSize" Value="20" />
    <Setter Property="Margin" Value="5" />
    <Setter Property="SelectedIndex" Value="0" />
    <Setter Property="IsSynchronizedWithCurrentItem" Value="True" />
</Style>
4

1 に答える 1

0

あなたは特定の文化にComboBoxバインドしています。SelectedValueこれにより、使用可能なカルチャのリストからそのカルチャが選択されるため、CurrentCultureプロパティでセットがトリガーされます。

aのContentプロパティはButton、ユーザーに何かを表示するだけで、割り当ては行いません。プロパティ値を読み取って表示します。そのため、イベントのカルチャを手動で変更Clickして何かを実行させる必要があります。

ユーザーが使用可能な値のリストから値を選択できるようにする場合は、ComboBoxorを使用ListBoxします。AButtonは特定のアクションをトリガーするためのものであり、リストから選択するためのものではありません。

于 2013-02-15T19:34:44.607 に答える