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}" />

現在、ツリーは適切に機能しているため、ツリー項目を強調表示してビューの [OK] ボタンをクリックすると、すべて問題ありません。ただし、ユーザーがツリー項目の 1 つをダブルクリックできるようにする必要もあります。これは、必要なロジックを備えたビュー モデルに、すでにコマンドとメソッド、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 用に既に持っている Attached Behavior を使用する可能性がある場所です。

それ以外の場合は、添付ビヘイビアーを作成し、コマンドとオプションでコマンド パラメーターにバインドする 2 つの添付プロパティを作成する、私が使用する完全なコードを次に示します。

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 - Attached Behavior がある場所の名前空間を忘れずに追加してください。

<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

これを達成するためにいくつかの方法を試しました。ビルドと実行に変更が適用されていないことに気付きました。

VS2010 を開いて、同じ問題が発生していないことを確認しました。上司と話し合ったところ、これは MVVM に固執することが最も賢明な選択ではない可能性がある状況の良い例であることがわかりました。

ビュー モデルのインスタンス化をデータ コンテキストとして使用して、コード ビハインドを介してビュー モデルにバウンスしただけです。それをするのに1秒もかかりませんでした。

他の解決策については、完全に可能であると確信していますが、VS2012の問題のため、ここで行った投稿を確認または拒否することはできません.

于 2012-12-24T19:56:08.697 に答える
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 に答える