C# ObservableCollection.CollectionChanged未在工具栏上选择正确的数据模板

C# ObservableCollection.CollectionChanged未在工具栏上选择正确的数据模板,c#,wpf,datatemplate,C#,Wpf,Datatemplate,我有一个工具栏,其中包含3个用于我的项目的数据模板: <ToolBar ItemsSource="{Binding ContextActions}" Background="Transparent" ToolBarTray.IsLocked="True"> <ToolBar.Resources> <DataTemplate DataType="{x:Type viewModels:SimpleContextActionVi

我有一个工具栏,其中包含3个用于我的项目的数据模板:

  <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是一个可观察的集合

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

如果我将另一个“SimpleContextActionViewModel”添加到ObservableCollection,工具栏只会添加一个调用ToString的ContentPresenter。如果我添加以下行以将ObservableCollection重新设计为一个新集合,则一切正常:

this.ContextActions = new ObservableCollection<object>(this.ContextActions);
this.ContextActions=新的ObservableCollection(this.ContextActions);
这将触发my ViewModel的NotifyPropertyChanged实现,所有项目都将重新创建并看起来良好

为什么我的ObservableCollection的CollectionChanged没有选择有效的DataTemplate,而PropertyChanged却选择了有效的DataTemplate

这就是它的样子

我不确定这是否适用于您的情况,但您的问题似乎非常类似于:

从该链接上的公认答案中:

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

如果将DisplayMemberPath=“Name”添加到列表框,它将生成一个 正确绑定到您的姓名的模板-将 然后按预期自动更新


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

我以前在工具栏上看到过这种情况,当与集合一起使用时,会在构造函数以外的任何地方进行更改


不要在工具栏资源中添加数据模板,而是将它们添加到app.xaml,然后您将看到您的代码将正常工作。试试这个,如果它仍然不起作用,请告诉我

我认为这与我的示例无关,我已经定义了一个DataTemplate来显示我的数据,并且它对某些项目起到了预期的作用。如果您定义了关于如何显示类的数据模板,则无需使用DisplayMemberPath。显示成员路径不可能达到我想要的效果。我明天会尝试,尽管在应用程序级别管理如此特定的数据模板感觉非常糟糕。@Console不确定标准方法不起作用的确切原因。我前一段时间偶然发现了这个。如果您想要一个不同的解决方案,可以尝试实现ItemTemplateSelector并查看是否可以这样分配DataTemplates吗?