静态资源数组绑定仅适用于第一次

时间:2013-10-16 14:02:18

标签: wpf binding resources wpf-controls toolbar

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

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

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

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

工具栏控件的datacontext与文本编辑器绑定,文本编辑器包含所有命令绑定和布尔依赖属性(IsBoldIsItalic)。

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

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

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

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

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

我怀疑问题是我的数组是一个静态资源,因此工具栏会不时使用相同的实例,这会以某种方式破坏绑定。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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