【问题标题】:Static resource array binding only works for the first time静态资源数组绑定仅第一次有效
【发布时间】:2013-10-24 16:37:42
【问题描述】:

我创建了一个继承自工具栏的自定义控件。

我希望工具栏的默认控件模板包含几个默认按钮。

为了实现这一点,我创建了一个静态数组来保存按钮列表:

<x:Array x:Key="toolbarButtons" Type="{x:Type ToggleButton}">
        <ToggleButton Content="Bold" 
                      Command="{x:Static ns1:EditingCommands.Bold}"
                      CommandTarget="{Binding}"
                      IsChecked="{Binding IsBold, Mode=TwoWay}"/>
        <ToggleButton Content="Italic" 
                      Command="{x:Static ns1:EditingCommands.Italic}"
                      CommandTarget="{Binding}"
                      IsChecked="{Binding IsItalic, Mode=TwoWay}"/>
</x:Array>

工具栏控件具有绑定到文本编辑器的数据上下文,该文本编辑器包括所有命令绑定和布尔依赖属性(IsBoldIsItalic)。

我将 Toolbar ItemSource 设置为使用这样的数组:

<Setter Property="ItemsSource" Value="{StaticResource toolbarButtons}"/>

现在,当我在给定运行中第一次打开托管工具栏的窗口时,一切正常。

问题是,当我关闭窗口并重新打开它时,按钮绑定停止工作(IsCheked 属性停止连接到依赖属性)。

我使用 snoop 来检查绑定,它说IsChecked 的值是本地的,这意味着绑定被忽略了。

我怀疑问题是我的数组是静态资源,所以工具栏不时使用相同的实例,这不知何故破坏了绑定。

我的问题是如何解决这个问题,或者我应该使用不同的方法来实现工具栏的默认按钮?

【问题讨论】:

    标签: wpf binding resources wpf-controls toolbar


    【解决方案1】:

    我认为问题在于,当您在 XAML 中声明数组时,它只被实例化一次。因此,第二个工具栏(以及上)正在尝试使用完全相同的对象。重复使用时,您的绑定很可能会被覆盖。

    【讨论】:

    • 这个数组是在 UserControl 的 XAML 中定义的,还是在某处的其他 XAML 中定义的(例如 Application.Resources)?如果它在 UserControl 中,我认为我的答案不正确。如果它在其他地方,请尝试将其移至 UserControl。
    • 尝试将 x:Shared="False" 添加到数组声明中。
    【解决方案2】:

    您是否尝试将x:Shared="False" 添加到数组声明中?

    <x:Array x:Key="toolbarButtons" x:Shared="False" Type="{x:Type ToggleButton}">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2023-02-22
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      相关资源
      最近更新 更多