使用telerik radtreecontrol双击MVVM绑定方法

时间:2012-12-13 20:10:40

标签: c# wpf xaml mvvm telerik

我一直在努力解决这个问题。尽管我内心的人说“不要这样做”,现在是时候问路了。

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

3 个答案:

答案 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问题,我无法确认或否认我在这里发布的帖子。