为gridview datatemplate设置x:dataType

时间:2016-02-07 17:37:27

标签: c# xaml uwp xbind

我有GridView

<GridView ItemsSource="{x:Bind ViewModel.SoundEffects}">
    <GridView.ItemTemplate>
        <DataTemplate x:dataType="?">
            <Button Style="{StaticResource defaultButton}"
                    Content="{Binding Name}"
                    Tag="{Binding FileName}"
                    Command="{x:Bind ViewModel.PlayCommand}"
                    CommandParameter="{Binding FileName}"/>
        </DataTemplate>
    </GridView.ItemTemplate>

每当我尝试编译它时,它说我需要指定一个模型,但是当我尝试创建一个接口时,我无法弄清楚,如何制作包含ViewModel定义的模型:

public interface ISoundEffectButton 
{ 
    string Name { get; } 
    string FileName { get; } 
    ViewModels.MainPageViewModel ViewModel { get; } 
}

但是这不起作用并且破坏了整个调试器。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

  

在DataTemplate内部(无论是用作项目模板,内容模板还是标题模板),Path的值不会在页面的上下文中解释,而是在模板化的数据对象的上下文中解释。因此,在编译时可以验证其绑定(以及为它们生成有效的代码),DataTemplate需要使用x:DataType声明其数据对象的类型。

首先,你需要让你成为这样的模型:

public class SoundEffectButton 
{ 
    public string Name { get; set;} 
    public string FileName { get; set;} 
    public ICommand Play { get; set; }
}

它是Class,而不是界面。然后在您的页面中使用它:

xmlns:data="using:[the namespace of your model]

x:DataType的{​​{1}}可以设置如下:

GridView

在ViewModel中,您可以为数据使用集合:

<DataTemplate x:DataType="data:SoundEffectButton">

最后,在页面的cs文件中使用ViewModel:

public ObservableCollection<SoundEffectButton> SoundEffects;

public MainPage() { this.InitializeComponent(); ViewModel = new MainPageViewModel(); } public MainPageViewModel ViewModel { get; set; } 应该是这样的:

GridView

我在这里为你的问题写了demo,你可以看一下。