TreeViewItem选择更改时,WPF MVVM更新文本编辑器

时间:2017-06-27 13:36:18

标签: c# wpf mvvm treeview

我有一个DirectoryItems的TreeView,其定义如下:

public class DirectoryItem : INotifyPropertyChanged
{
    public String DisplayName { get; set; }
    public String Fullpath { get; set; }
    public ObservableCollection<DirectoryItem> Children { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

当用户从treeView中选择一个DirectoryItem时,我想从该项中获取Fullpath,读取文件中的所有文本,然后将其加载到文本编辑器中。

我的ViewModel有一个文本编辑器绑定的DisplayText属性:

internal class MainWindowViewModel : IMainWindowViewModel
{
    private ObservableCollection<DirectoryItem> DirectoryItems { get; set; }

    public string DisplayText { get; set; }
    //this needs to be implemented to take a filepath and read from it
}

我认为应该有一个被调用的命令与TreeViewItem的IsSelected属性相关联,该属性将Fullpath传递给ViewModel,但我还没有能够使代码正常工作。我该如何实现?

在这里,我拥有的我无法工作,我得到了一个&#34;属性触发器无法连接到Style&#34;错误:

<Style TargetType="{x:Type TreeViewItem}">
    <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectedItemChanged">
                    <i:InvokeCommandAction Command="{Binding DisplayText}" CommandParameter="{Binding ElementName=treeView, Path=SelectedItem}"/>
                </i:EventTrigger>
    </i:Interaction.Triggers>
</Style>

谢谢。

1 个答案:

答案 0 :(得分:1)

您无法在Style内添加互动触发器。

您可以做的是向IsSelected类添加DirectoryItem属性,并将IsSelected的{​​{1}}属性绑定到此属性:

TreeViewItem
<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>

确保在public class DirectoryItem : INotifyPropertyChanged { public String DisplayName { get; set; } public String Fullpath { get; set; } public ObservableCollection<DirectoryItem> Children { get; set; } private bool _isSelected; public bool IsSelected { get { return _isSelected; } set { _isSelected = value; NotifyPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 设置为新值时实际提升PropertyChanged属性。

然后,视图模型可以连接到IsSelected中每个项目的PropertyChanged事件,并在选择项目时执行某些操作:

ObservableCollection<DirectoryItem>

如果要动态地向internal class MainWindowViewModel : IMainWindowViewModel { public MainWindowViewModel() { //add the items... DirectoryItems.Add(new DirectoryItem() { DisplayName = "test", Children = new ObservableCollection<DirectoryItem>() { new DirectoryItem() { DisplayName = "child" } } }); foreach(var item in DirectoryItems) { item.PropertyChanged += Item_PropertyChanged; } } private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) { if(e.PropertyName == "IsSelected") { DirectoryItem selectedItem = sender as DirectoryItem; //set the DisplayText property } } public ObservableCollection<DirectoryItem> DirectoryItems { get; set; } = new ObservableCollection<DirectoryItem>(); public string DisplayText { get; set; } } 添加项目,您可能还希望处理ObservableCollection<DirectoryItem>事件以将事件处理程序连接到任何新对象:

CollectionChanged
相关问题