【问题标题】:Command not firing on current item命令未在当前项目上触发
【发布时间】:2021-01-27 20:55:45
【问题描述】:

我有一个CarouselView。 ItemsSource 绑定到类型为AlarmEventObservableCollectionAlarmEvent 是不同类型警报事件(Generic、Fr、Vfr、Anpr)的基类。 ItemTemplate 会根据 CurrentItem 的类型而变化。这行得通。

Xaml:

<CarouselView x:Name="cvAlarmEvents"
              ItemsSource="{Binding AlarmEvents}"
              CurrentItem="{Binding SelectedAlarmEvent}"
              CurrentItemChangedCommand="{Binding CmdSelectedAlarmEventChanged}"
              ItemTemplate="{StaticResource AlarmEventDataTemplateSelector}"
              Grid.Row="2"
              Margin="0, 2, 0, 0"
              BackgroundColor="#141d3d"                      
              IsVisible="true"/>

模板选择器:

public class AlarmEventDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate Generic { get; set; }
    public DataTemplate Fr { get; set; }
    public DataTemplate Tfr { get; set; }
    public DataTemplate Anpr { get; set; }

    public AlarmEventDataTemplateSelector()
    {
        Generic = new DataTemplate(typeof(GenericView));
        Fr = new DataTemplate(typeof(FrView));
        Tfr = new DataTemplate(typeof(TfrView));
        Anpr = new DataTemplate(typeof(AnprView));
    }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        var alarmEvent = item as AlarmEvent;

        switch (alarmEvent.Type)
        {
            case Enums.AlarmEventType.None:
                return null;
            case Enums.AlarmEventType.Generic:
                return Generic;
            case Enums.AlarmEventType.FaceRecognition:
                return Fr;
            case Enums.AlarmEventType.TemperatureFaceRecognition:
                return Tfr;
            case Enums.AlarmEventType.ANPR:
                return Anpr;
            default:
                return null;
        }
    }
}

GenericView、FrView 等继承自 ContentView。实际的命令绑定在从 AlarmEventDataTemplateSelector 返回的 DataTemplate (ContentView) 中:

<ImageButton Source="CamWhite1"
                                         BackgroundColor="Transparent"
                                         Scale="1"
                                         BorderColor="White"
                                         BorderWidth="3"
                                         Padding="10"
                                         Margin="10, 5"
                                         Command="{Binding CmdAddPic}" />

除了命令绑定之外,我在模型上有很多数据绑定都可以工作。我已经使用 OnClick 事件测试了按钮,它们按应有的方式触发,这让我认为 Command 数据绑定不起作用。

下面是命令代码在 AlarmEvent 中的样子

public class AlarmEvent : BaseModel
    {
        public Command CmdAddPic { get; set; }

        public AlarmEvent()
        {
            CmdAddPic = new Command(AddPic);
        }

        public void AddPic()
        {
            // I dont fire and this makes me sad ;(
        }
    }

我在网上找不到有关此问题的单个线程。我可以找到无数线程,他们试图将来自选定项目的命令绑定到他们的视图模型。这不是我想要的。我只是想让命令绑定在我的数据模型(AlarmEvent)上工作,但我很困惑为什么它不起作用。也许我遗漏了一些明显的东西?

【问题讨论】:

  • CmdAddPic 在哪里实际使用或绑定到任何东西?
  • 抱歉,CmdAddPic 在我的 AlarmEvent 类中。我会更新问题以反映这一点。
  • 仍然缺少一些东西 - 您实际绑定 CmdAddPic 的 XAML 在哪里?
  • 再次道歉,我已经更新了问题以反映它们的位置。它们位于数据模板 (ContentView) 中
  • 我的意思是,GenericView 例如继承自 ContentView。

标签: c# xamarin mvvm data-binding


【解决方案1】:

我是个愚蠢的流浪汉,没有早点意识到这一点,解决方法是:

而不是像这样的自动属性 ​​-

public Command CmdSubmitUserMedia{ get; set; }

我需要像这样使用完整的属性 -

private Command cmdSubmitUserMedia;
        [Ignore]
        public Command CmdSubmitUserMedia
        {
            get { return cmdSubmitUserMedia; }
            set { SetProperty(ref cmdSubmitUserMedia, value); }
        }

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多