【发布时间】:2021-01-27 20:55:45
【问题描述】:
我有一个CarouselView。 ItemsSource 绑定到类型为AlarmEvent 的ObservableCollection。 AlarmEvent 是不同类型警报事件(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