我一直在努力解决这个问题。尽管我内心的人说“不要这样做”,现在是时候问路了。
我使用MVVM设计模式在WPF C#中编码。除非没有选择,否则我们会严格遵守模式并在代码中不加任何内容,否则这样做是完全不合理的。话虽如此,我正在使用Telerik RadTreeView。以下是我的XAML中的片段:
<telerik:RadTreeView IsExpandOnSingleClickEnabled="True" IsLineEnabled="True" Margin="5"
ItemsSource="{Binding ItemsView}"
SelectedItem="{Binding SelectedWidget, Mode=TwoWay}"
ItemTemplate="{StaticResource NodeTemplate}" />
目前树正常工作,因此如果您突出显示树项并单击视图上的“确定”按钮,则一切都很好。但是,我还需要允许用户双击其中一个树项。这意味着我已经在我的视图模型中使用了所需逻辑的命令和方法 protected override void OkAction()。 Telerik提供了一个名为 ItemDoubleClick 的属性,该属性应该为树项双击提供功能。但我找不到任何允许我在视图模型中执行此操作的内容。换句话说,我该如何进行绑定?我们的项目中还有一个行为设置,用于双击,我被告知可以使用,但我没有行为经验。 WPF我还是有点湿。
如果有帮助,这里是Telerik文档的链接:http://www.telerik.com/help/wpf/radtreeview-events-overview.html
我希望任何人都可以提供帮助或指导。
试试Stan:
<Grid.Resources>
<DataTemplate x:Key="WidgetTemplate">
<StackPanel Orientation="Horizontal">
<Image Source="/Resources/gear1.png" Margin="1" Stretch="None" />
<TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="6,0,0,0" />
</StackPanel>
</DataTemplate>
<HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource = "{Binding Children}" ItemTemplate="{StaticResource WidgetTemplate}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
答案 0 :(得分:4)
您可以在此处使用已有的针对DoubleClick的附加行为。
否则,这里是我使用的完整代码,它创建了附加行为,并将创建两个附加属性,它们绑定到Command和可选的命令参数。
<强> AttachedBehaviors.cs 强>
public static class MouseDoubleClick
{
public static DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached("Command",
typeof(ICommand),
typeof(MouseDoubleClick),
new UIPropertyMetadata(CommandChanged));
public static DependencyProperty CommandParameterProperty =
DependencyProperty.RegisterAttached("CommandParameter",
typeof(object),
typeof(MouseDoubleClick),
new UIPropertyMetadata(null));
public static void SetCommand(DependencyObject target, ICommand value)
{
target.SetValue(CommandProperty, value);
}
public static void SetCommandParameter(DependencyObject target, object value)
{
target.SetValue(CommandParameterProperty, value);
}
public static object GetCommandParameter(DependencyObject target)
{
return target.GetValue(CommandParameterProperty);
}
private static void CommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
Control control = target as Control;
if (control != null)
{
if ((e.NewValue != null) && (e.OldValue == null))
{
control.MouseDoubleClick += OnMouseDoubleClick;
}
else if ((e.NewValue == null) && (e.OldValue != null))
{
control.MouseDoubleClick -= OnMouseDoubleClick;
}
}
}
private static void OnMouseDoubleClick(object sender, RoutedEventArgs e)
{
Control control = sender as Control;
ICommand command = (ICommand)control.GetValue(CommandProperty);
object commandParameter = control.GetValue(CommandParameterProperty);
if (command.CanExecute(commandParameter))
command.Execute(commandParameter);
}
}
.xaml - 请记住添加附加行为所在的命名空间。
<telerik:RadTreeView IsExpandOnSingleClickEnabled="True"
IsLineEnabled="True"
Margin="5"
ItemsSource="{Binding ItemsView}"
SelectedItem="{Binding SelectedWidget, Mode=TwoWay}"
ItemTemplate="{StaticResource NodeTemplate}"
acb:MouseDoubleClick.Command="{Binding ShowItemCommand}" />
<强> SampleViewModel.cs 强>
private RelayCommand _showItemCommand;
public RelayCommand ShowItemCommand
{
get
{
return _showItemCommand ?? (_showItemCommand =
new RelayCommand(ShowItemDetails, IsItemSelected));
}
}
答案 1 :(得分:0)
显然我没有Telerik代码,所以我不能像我想的那样真正帮助,但你可以试试这样的东西。 (免责声明:我是从脑子里写的)
在Grid.Resources
<Style TargetType="{x:Type RadTreeViewItem }" x:Key="TreeViewItemStyle">
<EventSetter Event="MouseDoubleClick" Handler="{Binding DoubleClick}" />
</Style>
将样式添加到容器样式。
<telerik:RadTreeView IsExpandOnSingleClickEnabled="True" IsLineEnabled="True" Margin="5"
ItemsSource="{Binding ItemsView}"
SelectedItem="{Binding SelectedWidget, Mode=TwoWay}"
ItemTemplate="{StaticResource NodeTemplate}"
ItemContainerStyle ="{StaticResource TreeViewItemStyle}"/>
让我知道它是否有效。
答案 2 :(得分:0)
我尝试了几种方法来实现这一目标。最后,我发现VS2012给了我适合。我注意到在构建和运行时没有应用更改。
我打开VS2010,发现我没有遇到同样的问题。在与我的老板交谈之后,我们发现这是一个很好的例子,因为双击严格与UI相关,所以坚持MVVM可能不是最明智的选择。
我只是使用视图模型的实例化作为数据上下文,通过后面的代码跳转到视图模型中。没花一秒钟才做到这一点。
至于其他解决方案,我确信它完全有可能,但由于我的VS2012问题,我无法确认或否认我在这里发布的帖子。