簡體   English   中英

消息中心未訂閱

[英]MessagingCenter not subscribing

我是 Xamarin 的新手(通常是編碼新手)。

我在ListView中使用xct TouchEffect來嘗試獲取 LongPress 菜單。

由於TouchEffect.LongPressCommand是一個命令,我只能將它綁定到 model 頁面。 所以......我正在嘗試通過MessagingCenter將信息發送到代碼隱藏。

我遇到的問題是消息沒有收到。

我讀了很多書並試圖弄清楚,我想為了能夠接收到消息,訂閱者需要先實例化/初始化。

我遇到的主要問題是......我不知道該怎么做,哈哈。

還是我想做的整件事都是錯的?

我將添加一些代碼,但如果需要其他任何內容,請告訴我。

注意:加載頁面(當應用程序啟動時)是一個 GroupPage(工作正常),問題出在 ItemsPage。

非常感謝大家。

項目頁面.xaml

<ContentPage.BindingContext>
    <localvm:ItemViewModel/>
</ContentPage.BindingContext>

<ListView ItemsSource="{Binding Items, Mode=TwoWay}" x:Name="lstView" 
                  AbsoluteLayout.LayoutBounds="0,0,1,1" 
                  AbsoluteLayout.LayoutFlags="All"
                  SelectedItem="{Binding SelectedItem}" HasUnevenRows="True" RowHeight="50">

    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>

                <Grid Padding="0,0,8,0" Margin="4,0,4,0" xct:TouchEffect.LongPressCommand="{Binding LongPressItemCommand}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="7*"/>
                    </Grid.ColumnDefinitions>

                    <Label Text="{Binding ItemName}" TextColor="Black" Grid.Column="1" FontSize="Medium"></Label>

                    <Label Text="{Binding ItemDescription}" Grid.Column="1" VerticalTextAlignment="End"/>

                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

項目頁面.cs

namespace MobileApp2
{
    public partial class ItemsPage : ContentPage
    {
        public ItemsPage()
        {
            InitializeComponent();
            MessagingCenter.Subscribe<Item, Guid>(this, "PopupMenuItemMsg",
                 (page, itemId) =>
                 {
                     Main_PopupMenu(itemId);
                 });
        }
        public async void Main_PopupMenu(Guid itemId)
        {
            DisplayActionSheet("Test", "Test", "OK");
        }
    }
}

Items.cs (模型)

namespace MobileApp2
{
    public class Item : INotifyPropertyChanged
    {
        public Command LongPressItemCommand { get; }

        public Guid ItemId { get; set; }

        public Guid GroupId { get; set; }

        private string itemName = string.Empty;
        public string ItemName
        {
            get { return itemName; }
            set
            {
                if (value != null) itemName = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ItemName"));
            }
        }

        private string itemDescription = string.Empty;
        public string ItemDescription
        {
            get
            {

                return itemDescription.Trim();
            }
            set
            {
                if (value != null) itemDescription = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ItemDescription"));
            }
        }


        public Item(string itemName, string itemDescription)
        {
            ItemName = itemName;
            ItemDescription = itemDescription;
        }

        public Item()
        {
            LongPressItemCommand = new Command(() =>
            {
                MessagingCenter.Send<Item, Guid>(this, "PopupMenuItemMsg", ItemId);
            });
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

您可以使用 Command 的相對綁定檢查下面的代碼。

Model:

public class Item
{
    public string ItemName { get; set; }
    public string ItemDescription { get; set; }
   

}

視圖模型:

public class ItemViewModel
{
    public ICommand LongPressItemCommand { get; set; }
    public Guid ItemId { get; set; }
    public ObservableCollection<Item> Items { get; set; }
    public ItemViewModel()
    {
         LongPressItemCommand = new Command(() =>
        {

            MessagingCenter.Send<ItemViewModel, Guid>(this, "PopupMenuItemMsg", ItemId);
        });
        
        CreateCollection();
    }



    public void LongPress()
    {

    }
    public void CreateCollection()
    {
        Items = new ObservableCollection<Item>()
        {
            new Item(){ ItemName="A", ItemDescription="AA"},
            new Item(){ ItemName="B", ItemDescription="BB"},
            new Item(){ ItemName="C", ItemDescription="CC"},
        };

    }
}

Xaml:

  <ContentPage.BindingContext>
    <localvm:ItemViewModel></localvm:ItemViewModel>
</ContentPage.BindingContext>
<StackLayout>
    <ListView ItemsSource="{Binding Items, Mode=TwoWay}" x:Name="lstView" 
              AbsoluteLayout.LayoutBounds="0,0,1,1" 
              AbsoluteLayout.LayoutFlags="All"
              SelectedItem="{Binding SelectedItem}" HasUnevenRows="True" RowHeight="50">

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid Padding="0,0,8,0" Margin="4,0,4,0" xct:TouchEffect.LongPressCommand="{Binding Path=BindingContext.LongPressItemCommand, Source={x:Reference Name=lstView}}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>

                        <Label Text="{Binding ItemName}" TextColor="Black" Grid.Column="0" FontSize="Medium"></Label>

                        <Label Text="{Binding ItemDescription}" Grid.Column="1" VerticalTextAlignment="End"/>

                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
   
</StackLayout>

后面的代碼:

 MessagingCenter.Subscribe<ItemViewModel, Guid>(this, "PopupMenuItemMsg",
           (page, itemId) =>
           {
               Main_PopupMenu(itemId);
           });

暫無
暫無

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

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