C# WPF和Prism-绑定到TemplateSelector驱动的ListBoxItem';在ViewModel绑定代码中未触发IsSelected事件

C# WPF和Prism-绑定到TemplateSelector驱动的ListBoxItem';在ViewModel绑定代码中未触发IsSelected事件,c#,wpf,prism,C#,Wpf,Prism,我使用棱镜和WPF。这是我的ViewModel: using DialogueTool.Service.Abstracts; using DialogueTool.Service.Models.Concretes; using Prism.Commands; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.Collections.ObjectMo

我使用棱镜和WPF。这是我的ViewModel:

using DialogueTool.Service.Abstracts;
using DialogueTool.Service.Models.Concretes;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace DialogueTool.UI.ViewModels
{
    public class DialogueEntryControlViewModel : BindableBase, INavigationAware
    {
        private IServices services;
        private DialogueWrapperModel dialogueWrapperModel;

        public DialogueEntryControlViewModel(IServices _services)
        {
            services = _services;
        }

        DialogueWrapperModel DialogueWrapperModel { get; set; }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            dialogueWrapperModel = navigationContext.Parameters.GetValue<DialogueWrapperModel>("DialogueWrapperModel");
            DialogueEntries = new ObservableCollection<DialogueEntryModel>(dialogueWrapperModel.DialogueEntries);
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            //throw new NotImplementedException();
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            //throw new NotImplementedException();
        }

        #region Properties

        private ObservableCollection<DialogueEntryModel> _breadCrumbs = new ObservableCollection<DialogueEntryModel>();
        public ObservableCollection<DialogueEntryModel> BreadCrumbs
        {
            get { return _breadCrumbs; }
            set { SetProperty(ref _breadCrumbs, value); }
        }

        /// <summary>
        /// 
        /// </summary>
        public ObservableCollection<DialogueEntryModel> _dialogueEntries = new ObservableCollection<DialogueEntryModel>();
        public ObservableCollection<DialogueEntryModel> DialogueEntries
        {
            get { return _dialogueEntries; }
            set{ SetProperty(ref _dialogueEntries, value); }
        }

        private DialogueEntryModel _selectedDialogueEntry;
        public DialogueEntryModel SelectedDialogueEntry
        {
            get { return _selectedDialogueEntry; }
            set { SetProperty(ref _selectedDialogueEntry, value); }
        }

        private DialogueEntryModel _selectedDialogueEntryChoice;
        public DialogueEntryModel SelectedDialogueEntryChoice
        {
            get { return _selectedDialogueEntryChoice; }
            set { 
                SetProperty(ref _selectedDialogueEntryChoice, value);

                BreadCrumbs.Add(value);
            }
        }
        #endregion

        #region Commands
        #endregion
    }
}
我已经读到,可能是树吸收了点击事件,但我还没有弄清楚如何确保所选项目事件工作

为了确保不会遗漏任何重要的内容,我使用的DataTemplateSelector类如下:

using DialogueTool.Domain.Enums;
using DialogueTool.Service.Models.Concretes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace DialogueTool.UI.DataTemplateSelectors
{
    public class DialogueEntryDataTemplateSelector : DataTemplateSelector
    {
        public DataTemplate QuestionTemplate { get; set; }
        public DataTemplate TextTemplate { get; set; }
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var dialogueEntryModel = item as DialogueEntryModel;

            switch (dialogueEntryModel.Type)
            {
                case DialogueEntryType.Question:
                    return QuestionTemplate;
                case DialogueEntryType.Text:
                    return TextTemplate;
                default:
                    return TextTemplate;
            }
        }
    }
}
对评论中问题的回答:

Q:什么是“不触发属性” A:更改所选项目时,不会触发以下设置方法

private DialogueEntryModel _selectedDialogueEntryChoice;
public DialogueEntryModel SelectedDialogueEntryChoice
{
    get { return _selectedDialogueEntryChoice; }
    set { 
        SetProperty(ref _selectedDialogueEntryChoice, value);

        BreadCrumbs.Add(value);
    }
}
例如,
SelectedDialogueEntry
set方法确实会被触发

我正在尝试的事情:

我尝试绑定到Xaml的UserControl元素,我希望它能够访问DataContext,从而访问我的ViewModel。。。但没有用:

<ListBox ItemsSource="{Binding DialogueEntries}"
         SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=SelectedDialogueEntryChoice}">

我发现的事情:


如果我将代码从模板选择器中取出,SelectedDialogueEntryChoice将起作用。因此,我假设这与它失去对ViewModel的访问有关,诀窍是直接绑定到
DataContext
。我还需要找到
DataContext
绑定到的
UserControl
AncestorType

<ListBox ItemsSource="{Binding DialogueEntries}"
         SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SelectedDialogueEntryChoice, Mode=TwoWay}">


什么是“不触发属性”呢?非常感谢您的提问。我在帖子底部添加了一个问答部分,这和模板制作有关。一旦我在模板中移动绑定,它就会失去连接
<ListBox ItemsSource="{Binding DialogueEntries}"
         SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=SelectedDialogueEntryChoice}">
<ListBox ItemsSource="{Binding DialogueEntries}"
         SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SelectedDialogueEntryChoice, Mode=TwoWay}">