我有一个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>
谢谢。
答案 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