6

我已经在这个问题上工作了很长时间。尽管我内心的人说“不要这样做”,但现在是问路的时候了。

我正在使用 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

我将不胜感激任何人可以提供的任何帮助或指导。

试试这个斯坦:

<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>
4

3 回答 3

4

这是您可能希望使用 DoubleClick 已有的附加行为的地方。

否则,这里是我使用的完整代码,它创建附加行为并将创建两个附加属性,它们绑定到命令和可选的命令参数。

附加行为.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));
    }
}
于 2012-12-14T21:49:47.733 回答
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}"/>

让我知道它是否有效。

于 2012-12-13T20:50:12.923 回答
0

我尝试了几种方法来完成这项工作。最后我发现 VS2012 让我很适合。我注意到更改没有应用于构建和运行。

我打开 VS2010 发现我没有遇到同样的问题。在与我的老板交谈后,我们发现这是一个很好的例子,即坚持 MVVM 可能不是最明智的选择,因为双击与 UI 严格相关。

我只是使用视图模型的实例化作为数据上下文,在后面的代码中跳转并进入视图模型。只需要一秒钟就可以做到这一点。

至于其他解决方案,我确信这是完全可能的,但由于我的 VS2012 问题,我无法确认或否认我在这里发布的帖子。

于 2012-12-24T19:56:08.697 回答