0

我有一个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; } 
}

但这不起作用并且使整个调试器崩溃。

谢谢你的时间。

4

1 回答 1

3

在 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:DataTypeofGridView可以设置如下:

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

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

public ObservableCollection<SoundEffectButton> SoundEffects;

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

public MainPage()
{
    this.InitializeComponent();
    ViewModel = new MainPageViewModel();
}

public MainPageViewModel ViewModel { get; set; }

GridView应该是这样的:

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

我在这里为你的问题写了一个演示,你可以看看。

于 2016-02-08T05:56:39.397 回答