在DataTemplate中使用MVVM Light EventToCommand

时间:2013-03-10 08:16:26

标签: wpf mvvm-light eventtocommand

所以我有一个WPF UserControl:

<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;
    }
}

我已尝试过在网络上遇到的每种方法,以便在DataSourceTemplate DataTemplate中触发EventToCommand。事实上,我很确定它知道OpenCommand的位置,因为如果我将路径更改为gobbledygook,则输出窗口会抛出一个错误,指出“ObjectTreeView”(它是绑定到的ObjectTreeViewModel视图模型的实例) UserControl)没有gobbledygook属性。所以我认为我已经正确设置了DataContext ......

但每当我点击文本块时......都没有。

真的试图避免代码隐藏(它只是感觉不对),并且完全披露,我正在使用MVVM Light的EventToCommand而不是完整的工具包,尽管我很想重写我到目前为止所看到的内容如果使用服务定位器将解决此问题。

2 个答案:

答案 0 :(得分:2)

TextBlock控件没有Click事件。请参阅MSDN

您应该使用MouseLeftButtonDown事件:

<i:EventTrigger EventName="MouseLeftButtonDown">
   <!-- ... -->
</i:EventTrigger>

答案 1 :(得分:0)

您可以在文本块中放置超链接并将命令绑​​定到超链接吗? 请注意,如果需要,您可以将超链接设置为纯文本块样式。

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

还要确保将ObjectTreeView类实例化并加载到usercontrol的DataContext中。

相关问题