WPF DataTemplate和属性中的奇怪行为。

时间:2009-09-05 08:28:07

标签: wpf data-binding datatemplate

我有一个DataTemplate,它在StackPanel中显示按钮。每当用户单击按钮时,该按钮应该发光。所以我在模板中编写了必要的DataTrigger,并在我绑定的属性中编写了布尔条件。以下是详细信息:

<DataTemplate x:Key="ActionItemsTemplate" DataType="ActionItemViewModel">

        <ItemsControl IsTabStop="False" ItemsSource="{Binding}" Margin="6,2">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>                    
                    <StackPanel Orientation="Horizontal" />                        
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>

                    <Button x:Name="ActionButton" Command="{Binding Path=Command }" Content="{Binding Path=DisplayName}" Style="{DynamicResource HeaderButton}"/>
                    <!-- Set special values for Selected Item -->
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsSelected}" Value="True">
                            <Setter TargetName="ActionButton" Property="Style"  Value="{DynamicResource MainWindowSelectedButton}"/>
                            <!--Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}"-->
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </DataTemplate>

我已经实现了INotifyPropertyChanged接口,而Property ActionItems返回了一个ObservableCollection。

问题:当我更改ObservableCollection并调用INotifyPropertyChanged事件时,它不会直接反映在DataTemplate中,而只会更改属性。但是,如果我用自己重新分配整个对象,它就可以完美地运行。

e.g

void Test1()
        {
           _commands[0].IsSelected = !_commands[0].IsSelected;               
            _commands[0] = _commands[0];      // Does not work If this line is commented out        
            ActionItems = _commands;
        }

问题是什么?

编辑:我发现在这种情况下问题可能出在DataBinding上。

我现在遇到了类似的问题,我将Expander控件的IsExpanded属性绑定到TabPanel内的bool属性。当我切换bool属性时,值会在后面更改,但不会在显示中反映出来。但是假设我改变标签然后回来,我看到发生了变化。这是否与此问题有关here

我又想知道问题是什么(缩小了一点:) :)

编辑2 :第二个解决方案问题:我发现每当程序更新时,都需要调用INotifyPropertyChanged接口的OnPropertyChangedEvent IsExpanded属性已更新。至于原始问题,似乎并非如此,我仍然在试图弄清楚出了什么问题。 :)

2 个答案:

答案 0 :(得分:0)

我被引导相信你无法取代该系列,只会改变它的内容。

答案 1 :(得分:0)

  

我绑定的属性中的布尔条件

我不完全确定你在这里的意思,但我猜测这是你的“命令”中的IsSelected属性,你忘了为该属性引发PropertyChanged。