2

だから私はWPFUserControlを持っています:

<UserControl x:Class="BI_Builder.Views.ObjectTreeView"
             x:Name="UC1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:BI_Builder"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
                 xmlns:viewModels="clr-namespace:BI_Builder.ViewModels"
             xmlns:command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" DataContext="{Binding}">

    <UserControl.Resources>
        <ContentControl x:Key="Context" Content="{Binding}" />

        <DataTemplate x:Key="DataSourceTemplate">
            <TextBlock Text="{Binding Path=Name}" >
     <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <command:EventToCommand Command="{Binding Path=DataContext.OpenCommand, Mode=OneWay,ElementName=UC1}"                />
                </i:EventTrigger>
            </i:Interaction.Triggers>
               </TextBlock>
        </DataTemplate>

        <HierarchicalDataTemplate x:Key="ItemTemplate"
                                          ItemsSource="{Binding Children}"
                                          ItemTemplate="{StaticResource DataSourceTemplate}">
            <StackPanel>
                <TextBlock Text="{Binding Header}">
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate> 
    </UserControl.Resources>


    <Grid>
        <TreeView Name="TreeView" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource ItemTemplate}" >
        </TreeView>
    </Grid>
</UserControl>

そして、これがユーザーコントロールのメインビューモデルです。

public class ObjectTreeViewModel : ObservableObject       {

        public  ObservableCollection<ItemViewModel> Items  {
            get {
                if (_items != null) return _items;
                _items =  new ObservableCollection<ItemViewModel>();
                _items.Add(DataSources);
                return _items;

            }
            set { _items = value;
            }
        }

        public ItemViewModel DataSources {
            get { return _dataSources ?? (_dataSources = new ItemViewModel() { Header = "Data Sources", Children = new ObservableCollection<object>(DataSourceList) }); }
            set { _dataSources = value; }
        }

        public List<DataSource> DataSourceList;

        public ICommand OpenCommand    {
            get { if (_openCommand == null) { return _openCommand = new RelayCommand(OpenDataSource); } return _openCommand; }

        }

        private void OpenDataSource()           {
            MessageBox.Show("Test");
        }

        public ObjectTreeViewModel()      {
             DataSourceList = new List<DataSource>();
                DataSourceList.Add(new DataSource() { Name = "Test" });
        }


        private ItemViewModel _dataSources;
        private ObservableCollection<ItemViewModel> _items;
        private RelayCommand _openCommand;
    }
}

Webで出会ったすべてのメソッドを試して、DataSourceTemplateDataTemplateのEventToCommandを起動しました。実際、OpenCommandがどこにあるかはかなり確実です。パスをgobbledygookに変更すると、出力ウィンドウに「ObjectTreeView」(ObjectTreeViewModelビューモデルがバインドされているインスタンス)というエラーが表示されるためです。 UserControl)にはgobbledygookプロパティがありません。だから私はDataContextを正しく設定したと思います...

しかし、テキストブロックをクリックするたびに...何もありません。

本当にコードビハインド(間違っていると感じる)と完全な開示を避けようとしていますが、MVVM LightのEventToCommandを使用していますが、完全なツールキットは使用していませんが、これまでの内容を書き直して、 ServiceLocatorはこの問題を解決します。

4

2 に答える 2

3

TextBlockコントロールにはイベントがありませんClickMSDNを参照してください。

MouseLeftButtonDown代わりにイベントを使用する必要があります。

<i:EventTrigger EventName="MouseLeftButtonDown">
   <!-- ... -->
</i:EventTrigger>
于 2013-03-10T08:21:47.690 に答える
0

代わりにテキストブロック内にハイパーリンクを配置して、コマンドをハイパーリンクにバインドできますか? 必要に応じて、ハイパーリンクのスタイルをプレーン テキスト ブロックのように設定できることに注意してください。

<TextBlock>
     <Hyperlink Command="{Binding Path=DataContext.OpenCommand" Text="{Binding Path=Name}" />
</TextBlock>

また、ObjectTreeView クラスがインスタンス化され、ユーザー コントロールの DataContext に読み込まれていることを確認してください。

于 2013-03-10T12:07:31.923 に答える