在Windows Phone上使用HubTiles,PRISM和MVVM进行页面导航

时间:2014-03-07 03:21:16

标签: c# wpf mvvm windows-phone prism

我正在尝试使用WPToolkit,PRISM和MVVM设计中的HubTile控件。我的问题是导航页面。

MainPageModel

private string _navigationUri;
        public string NavigationUri
        {
            get { return _navigationUri; }
            set
            {
                if (_navigationUri != value)
                {
                    NotifyPropertyChanging();
                    _navigationUri = value;
                    NotifyPropertyChanged();
                }
            }
        }

MainPageViewModel

        private void Navigate(string s)
    {
        (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri(s, UriKind.RelativeOrAbsolute));
    }

        private DelegateCommand<string> _hubTileTap;
    public DelegateCommand<string> HubTileTap
    {
        get { return _hubTileTap; }
    }

_hubTileTap = new DelegateCommand<string>(Navigate);

XAML

<DataTemplate>
                        <toolkit:HubTile 
                            Margin="10"
                            Size="Default"
                            Title="{Binding Title}">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Tap">
                                    <i:InvokeCommandAction 
                                        Command="{Binding DataContext.HubTileTap}"
                                        CommandParameter="{Binding NavigationUri}"></i:InvokeCommandAction>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </toolkit:HubTile>
                    </DataTemplate>

在断点处,我可以看到我的方法实际上从未触发过。另外,老实说,我并不是100%确定我设置正确的方法将字符串从HubTile对象传递给DelegateCommand然后传递给Method。

我对MVVM,PRISM非常陌生,而且在编程时仍然是一个菜鸟。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

数据模板是什么?你有一堆瓷砖吗?模板的上下文通常是项目。所以,Title生活的地方就是命令将要发射的地方。

编辑:你添加的内容,DataContext.HubTileTap在模板中不起作用,DataContext就是项目。

使用棱镜执行此操作的一种可能方法是对项类进行操作。然后,在创建项目时,将每个项目的操作设置为点击方法。

public class EmptyClass
    {
        public ObservableCollection<HubTileItem> HubTiles { get; set; }

        public EmptyClass()
        {
            HubTiles = new ObservableCollection<HubTileItem>();
            HubTiles.Add(new HubTileItem { Title = "Tile1", HubTileTap = () => HubTileTap() };);
        }

        public void HubTileTap()
        {
        }
    }

    public class HubTileItem
    {
        public string Title { get; set; }

        public Action HubTileTap { get; set; }
    }