【问题标题】:WPF Dependency Property IssueWPF 依赖属性问题
【发布时间】:2013-01-31 19:48:00
【问题描述】:

我想知道是否有人可以向我解释两者之间的区别 将 Collection 的选定值绑定到组合框。

或将值绑定到按钮内容。

这样

<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。

但如果我使用组合框一切正常... Altought the comboBox 没有做任何事情,它只是一个“workarround” 在我的 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>

那就是当前文化

  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>

【问题讨论】:

  • 你的_culturedTitleViewModelSelectorStyle是什么?
  • 嗨 Lukazoid 请在底部查看我的编辑。

标签: c# wpf button data-binding combobox


【解决方案1】:

ComboBox 中,您将SelectedValue 绑定到特定的文化。这将从可用区域性列表中选择该区域性,并因此触发 CurrentCulture 属性上的集合。

ButtonContent 属性只是向用户显示某些内容,它没有进行任何分配。它读取属性值,然后显示它。这就是为什么您需要手动更改 Click 事件中的文化以使其执行任何操作。

如果您希望用户能够从可用值列表中选择一个值,ComboBoxListBox 是您的最佳选择。 Button 用于触发特定操作,而不是用于从列表中进行选择。

【讨论】:

  • 嗨,布赖恩,我不是这个意思。我正在使用按钮的内容{Binding Path=},当我从代码更改属性时它不会改变。如果我从组合框中做同样的事情,按钮的内容就会改变。
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 2019-04-17
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多