我在这里调整了TreeView Control示例项目,以便与Entity Framework对象一起使用.它运行得很漂亮,但是像许多其他人一样,尝试更新基于ParentViewModels的SelectedItem更改的集合或属性时,我也无法弥合理解的差距.
我在MVVM工作,希望我的代码隐藏免受任何混乱.作为一个初学者,我喜欢实现PropertyChanged通知的清洁,但由于它们没有固定的"SelectedItem"属性来绑定TreeView,我无法像往常一样提升我的PropertyChanged事件ListBox.
我的ChildViewModel上也有一个SelectedItem属性(实际上成功捕获了isSelected = true的对象)(参见HB对这个问题的回答).我也有我的ParentViewModel这势必我的看法(见@马丁Liversage的职位类型ChildViewModel的的SelectedItem 这里).我不能让他们同步.
请帮助我了解如何将SelectedItemChildViewModel 的属性传递给我的ParentViewModel.我没有将我的TreeView绑定到a CollectionView,所以我无法获取CurrentItem视图集合.
我正在处理的viewmodel集合非常查询,所以我现在还没有包含任何代码.请让我知道清楚需要什么.
treeview selecteditem mvvm inotifypropertychanged selecteditemchanged
在我的窗口中,我有一个TreeView和TextBox.假设TextBox用于编写自定义脚本,TreeView是一种选择要插入的函数的方法; 想想Crystal Report脚本编辑器.
我的目标是让用户单击TreeView的一个子项,并将该子项插入TextBox.子项是函数签名,位于父节点下.然后,用户可以导航到TextBox,选择一个功能参数并将其替换为另一个功能签名.为此,我处理TreeView的SelectedItemChanged事件,设置TextBox的SelectedText,然后尝试在文本更改后突出显示该文本.
正确地交换TextBox的SelectedText.但是,文本未突出显示,滚动条未滚动到所选文本.
这是我编写的测试项目中的XAML,用于重现行为:
<Window x:Class="SelectedTextWeirdness.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:SelectedTextWeirdness="clr-namespace:SelectedTextWeirdness" Title="MainWindow" Width="600" Height="600"
x:Name="Me">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TreeView Grid.Row="0" x:Name="treeView" ItemsSource="{Binding ElementName=Me, Path=TreeViewItems, Mode=TwoWay}"
SelectedItemChanged="treeView_SelectedItemChanged" Margin="10">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type SelectedTextWeirdness:Parent}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type SelectedTextWeirdness:Child}">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
<TextBox Grid.Row="1" x:Name="scriptTextBox" Margin="10" Height="200" Width="Auto" FontFamily="Consolas, Courier New"
HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"
MaxLines="9999" AcceptsReturn="True" AcceptsTab="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Text="{Binding Path=Script, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是代码隐藏:
using …Run Code Online (Sandbox Code Playgroud) 我继承了KryptonToolkit ListBox控件来获取SelectedItemChanging事件.
public class CPListBox : KryptonListBox
{
public event CancelEventHandler SelectedIndexChanging;
protected virtual void OnSelectedIndexChanging(CancelEventArgs e)
{
SelectedIndexChanging(this, e);
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
CancelEventArgs cArgs = new CancelEventArgs();
OnSelectedIndexChanged(cArgs);
if(!cArgs.Cancel)
{
base.OnSelectedIndexChanged(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在表单中,我使用代码处理事件:
void UsersListBoxSelectedIndexChanging(object sender, CancelEventArgs e)
{
if(_presenter.CurrentUser.IsModified)
{
MessageBox.Show("Nie zapisales zmian!");
e.Cancel = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到stackOverflow;)例外.也许有人现在这个代码是什么wron?