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:DataTypeGridView次のように設定できます。

<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 に答える