我有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; }
}
但是这不起作用并且破坏了整个调试器。
感谢您的时间。
答案 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,你可以看一下。