ObservableCollection.CollectionChanged未在ToolBar上选择正确的DataTemplate

时间:2015-06-08 14:30:33

标签: c# wpf datatemplate

我的项目有一个包含3个DataTemplates的ToolBar:

  <ToolBar ItemsSource="{Binding ContextActions}" Background="Transparent" ToolBarTray.IsLocked="True">
        <ToolBar.Resources>
            <DataTemplate DataType="{x:Type viewModels:SimpleContextActionViewModel}">
                <Button Command="{Binding ActionCommand}" Style="{StaticResource ToolBarButtonStyle}" ToolTip="{userInterface:Translation Binding={Binding ToolTip}}">
                    <ContentControl Template="{Binding Icon,Converter={StaticResource NameToResourceConverter}}" Margin="5" />
                </Button>
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:SeparatorViewModel}">
                <Rectangle Fill="{StaticResource SeparatorBrush}" Width="1" VerticalAlignment="Stretch" Margin="2,7" />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:PopupContextActionViewModel}">
                <Grid>
                    <ToggleButton IsChecked="{Binding ElementName=ContextActionPopup, Mode=TwoWay,Path=IsOpen}" Style="{StaticResource ToolBarButtonStyle}"
                                  ToolTip="{userInterface:Translation Binding={Binding ToolTip}}">
                        <ContentControl Template="{Binding Icon, Converter={StaticResource NameToResourceConverter}}" Margin="5" />
                    </ToggleButton>
                    <Popup Name="ContextActionPopup" Height="150" Width="150" StaysOpen="False">
                        <Border BorderBrush="{StaticResource PopupBorderBrush}" BorderThickness="1" Background="White">
                            <ContentControl userInterface:RegionHelper.RegionName="{Binding RegionId}" />
                        </Border>
                    </Popup>
                </Grid>
            </DataTemplate>
        </ToolBar.Resources>
    </ToolBar>

ItemsSource是一个ObservableCollection&lt; object&gt;

前三个项目已在我的ViewModel的构造函数中可用,这三个项目按预期使用DataTemplates。

如果我添加另一个&#34; SimpleContextActionViewModel&#34;对于ObservableCollection,ToolBar只添加一个调用ToString的ContentPresenter。如果我添加以下行来重新将ObservableCollection重新分配给新的,那么一切正常:

this.ContextActions = new ObservableCollection<object>(this.ContextActions);

这会触发我的ViewModel的NotifyPropertyChanged实现,并且所有项目都会重新创建并且看起来很好。

为什么我的ObservableCollection的CollectionChanged在PropertyChanged没有选择有效的DataTemplate时会这样做?。

这就是它的样子 This is how it looks

2 个答案:

答案 0 :(得分:3)

我已经看到过这种情况发生在工具栏上,当集合在构造函数之外的任何地方被更改时使用。

不是在工具栏资源中添加数据模板,而是将它们添加到app.xaml,然后您将看到您的代码将按预期运行。试试这个,让我知道它是否仍然无效

答案 1 :(得分:1)

我不确定这是否适用于您的情况,但您的问题似乎非常类似于:Wiring up CollectionChanged and PropertyChanged (Or : Why do some WPF Bindings not refresh?)

从该链接上接受的答案:

  

如果您没有为WPF提供数据项的模板(例如   列表中的Person对象),它默认使用ToString()   显示方法。那是一个成员,而不是一个财产,所以你得不到   值改变时的事件通知。

     

如果添加DisplayMemberPath =&#34; Name&#34;在列表框中,它会生成一个   模板,可以正确绑定到您的人的姓名 - 这将是   然后按照您的预期自动更新。

您是否可以将DisplayMemberPath应用于工具箱,以便默认情况下不使用ToString()进行渲染,而是触发NotifyPropertyChanged?