簡體   English   中英

是否可以不在 GridView 上定義數據類型?

[英]Is it possible to not define a DataType on a GridView?

我想訪問 ViewModel 本身的屬性,這些屬性不一定是我正在使用的集合的屬性的一部分。

我已經嘗試創建一個類,它具有我想要的所有屬性,作為一個包。 但此應用程序的性質需要所有實體都可以訪問的共享屬性。

假設我有以下內容:

<GridView
    ItemClick="{x:Bind ViewModel.GridView_ItemClick}"
    ItemsSource="{x:Bind ViewModel.GridViewGames, Mode=OneWay}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="models:GameModel">
                <ScrollViewer VerticalScrollBarVisibility="Visible">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding Name}" />
                        <TextBlock
                            Style="{StaticResource BodyTextBlockStyle}"
                            Text="{Binding CallToAction}"
                            TextWrapping="Wrap" />
                        <Button Command="{BIND TO AN ICOMMAND FROM THE VIEWMODEL AND NOT THE GAMEMODEL}"/>
                    </StackPanel>
                </ScrollViewer>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

我如何將作為 GridView 項目的按鈕綁定到 ViewModel 的命令?

您需要為Page命名並使用該名稱來綁定您的 ViewModel 命令。

主頁.xaml

<Page
    x:Class="GridViews.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:models="using:GridViews"
    x:Name="ThisPage"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">

    <Grid>
        <GridView ItemsSource="{x:Bind ViewModel.GridViewGames, Mode=OneWay}">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="models:GameModel">
                    <ScrollViewer VerticalScrollBarVisibility="Visible">
                        <StackPanel Orientation="Vertical">
                            <TextBlock
                                Style="{StaticResource SubtitleTextBlockStyle}"
                                Text="{x:Bind Name}" />
                            <TextBlock
                                Style="{StaticResource BodyTextBlockStyle}"
                                Text="{x:Bind CallToAction}"
                                TextWrapping="Wrap" />
                            <Button Command="{Binding ElementName=ThisPage, Path=ViewModel.TestCommand}" />
                        </StackPanel>
                    </ScrollViewer>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>
    </Grid>
</Page>

MainPageViewModel.cs

我在這里使用CommunityToolkit.Mvvm NuGet 包,但這與您的問題無關。

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;

namespace GridViews;

public class GameModel
{
    public string Name { get; set; } = string.Empty;
    public string CallToAction { get; set; } = string.Empty;
}

public partial class MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<GameModel> gridViewGames = new()
    {
        new GameModel() {Name="Name A", CallToAction="Call To Action A" },
        new GameModel() {Name="Name B", CallToAction="Call To Action B" },
        new GameModel() {Name="Name C", CallToAction="Call To Action C" },
    };

    [RelayCommand]
    private void Test()
    {
    }
}

您可以使用Xaml Behaviior SDK來實現它。

主頁.Xaml:

    <GridView x:Name="MyGridView"
ItemClick="{x:Bind ViewModel.GridView_ItemClick}"
ItemsSource="{x:Bind ViewModel.GridViewGames, Mode=OneWay}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="models:GameModel">
                <ScrollViewer VerticalScrollBarVisibility="Visible">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding Name}" />
                        <TextBlock
                        Style="{StaticResource BodyTextBlockStyle}"
                        Text="{Binding CallToAction}"
                        TextWrapping="Wrap" />


                        <Button x:Name="MyButton" Foreground="BurlyWood" FontSize="30" Content="{Binding Name}">
                            <Interactivity:Interaction.Behaviors>
                                <Core:EventTriggerBehavior EventName="Click" >
                                    <Core:InvokeCommandAction Command="{Binding DataContext.ViewModel.ButtonClickEvent, ElementName=MyGridView}" CommandParameter="{Binding}" />
                                </Core:EventTriggerBehavior>
                            </Interactivity:Interaction.Behaviors>
                        </Button>

                    </StackPanel>
                </ScrollViewer>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

ViewModel.cs

  public class TestViewModel 
{
    public List<GameModel> GridViewGames = new List<GameModel>();

    //*****
    // your original code 
    //*****


    // add the command
    public ICommand ButtonClickEvent
    {
        get
        {
            return new CommadEventHandler<GameModel>((s) => this.DataProcessing(s));
        }

    }

    private void DataProcessing(GameModel data)
    {
        try
        {
            Debug.WriteLine(data);
        }
        catch (Exception ex)
        {
           
        }
    }
}

public class CommadEventHandler<T> : ICommand
{
    public event EventHandler CanExecuteChanged;

    public Action<T> action;
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        this.action((T)parameter);
    }
    public CommadEventHandler(Action<T> action)
    {
        this.action = action;

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM