Xamarin.forms 如何将MVVMCross与C的标记绑定#

Xamarin.forms 如何将MVVMCross与C的标记绑定#,xamarin.forms,mvvmcross,xamarin-community-toolkit,Xamarin.forms,Mvvmcross,Xamarin Community Toolkit,我试图使用Xamarin社区工具包中的创建Xamarin.Forms视图,但希望使用MvvmCross绑定视图 我有一个MvxContentPage的有效解决方案,但我不确定每次设置ViewModel时调用Bind是否正确。有更好的地方吗 这是我的“工作”内容页 [MvxTabbedPagePresentation(WrapInNavigationPage = true, Title = "Equipment")] public sealed class Equipm

我试图使用Xamarin社区工具包中的创建Xamarin.Forms视图,但希望使用MvvmCross绑定视图

我有一个MvxContentPage的有效解决方案,但我不确定每次设置ViewModel时调用Bind是否正确。有更好的地方吗

这是我的“工作”内容页

[MvxTabbedPagePresentation(WrapInNavigationPage = true, Title = "Equipment")]
    public sealed class EquipmentPage : MvxContentPage<EquipmentViewModel>
    {
        private ListView _listView;

        public EquipmentPage()
        {
            Build();
        }
        
        protected override void OnViewModelSet()
        {
            base.OnViewModelSet();
            Bind();
        }

        private void Build()
        {
            //On<iOS>().SetLargeTitleDisplay(LargeTitleDisplayMode.Always);  
            // Xamarin.Forms.DebugRainbows.DebugRainbow.SetShowColors(this, true);
            Visual = VisualMarker.Material;
            Content = EquipmentList.Assign(out _listView);
        }

        private void Bind()
        {
            var set = CreateBindingSet();
            set.Bind(_listView).For(v => v.IsRefreshing)
                .To(vm => vm.IsRefreshing);
            set.Bind(_listView).For(v => v.RefreshCommand)
                .To(nameof(ViewModel.LoadData));
            set.Bind(_listView).For(v => v.ItemsSource)
                .To(vm => vm.Equipment);
            set.Apply();
        }
        
        private ListView EquipmentList => new ListView(ListViewCachingStrategy.RecycleElement)
        {
            // RowHeight = 100,
            HasUnevenRows = true,
            IsPullToRefreshEnabled = true,
            ItemTemplate = new DataTemplate(() => new EquipmentViewCell())
        };
    }
[MvxTabbedPagePresentation(WrapInNavigationPage=true,Title=“设备”)]
公共密封类设备页面:MvxContentPage
{
私有ListView _ListView;
公共设备第页()
{
Build();
}
受保护的覆盖无效OnViewModelSet()
{
base.OnViewModelSet();
Bind();
}
私有void Build()
{
//On().SetLargeTitleDisplay(LargeTitleDisplayMode.Always);
//Xamarin.Forms.DebugRainbows.DebugRainbow.SetShowColor(这是真的);
视觉=视觉标记材料;
内容=设备列表。分配(输出列表视图);
}
私有无效绑定()
{
var set=CreateBindingSet();
set.Bind(_listView).For(v=>v.IsRefreshing)
.To(vm=>vm.IsRefreshing);
set.Bind(_listView).For(v=>v.RefreshCommand)
.To(nameof(ViewModel.LoadData));
set.Bind(_listView).For(v=>v.ItemsSource)
.To(vm=>vm.Equipment);
set.Apply();
}
私有ListView设备列表=>new ListView(ListViewCachingStrategy.RecycleElement)
{
//行高=100,
HasRows=true,
IsPullToRefreshEnabled=true,
ItemTemplate=新数据模板(()=>new EquipmentViewCell())
};
}
下一步是为ListView绑定ViewCell。我还没有弄明白如何让这个工作。bindingContext必须是IMvxViewModel吗

这是我当前的ViewCell

public class EquipmentViewCell : MvxViewCell
    {
        private Label _nameLabel, _modelLabel, _typeLabel;
        
        public EquipmentViewCell()
        {
            Build();
        }
        
        enum EquipmentRow
        {
            Top,
            Bottom
        }

        enum EquipmentColumn
        {
            Left,
            Right
        }
        
        private void Build()
        {
            View = new Grid
            {
                RowDefinitions = GridRowsColumns.Rows.Define(
                    (EquipmentRow.Top, GridLength.Auto),
                    (EquipmentRow.Bottom, GridLength.Auto)),

                ColumnDefinitions = GridRowsColumns.Columns.Define(
                    (EquipmentColumn.Left, GridLength.Star),
                    (EquipmentColumn.Right, GridLength.Auto)),

                Children =
                {
                    new StackLayout
                    {
                        Orientation = StackOrientation.Horizontal,
                        Children =
                        {
                            new Label
                                {
                                    LineBreakMode = LineBreakMode.TailTruncation
                                }
                                .FontSize(20).Bold()
                                .StartExpand()
                                .Bind(nameof(EquipmentDto.Name))
                                .Assign(out _nameLabel),

                            new PancakeView
                                {
                                    CornerRadius = new CornerRadius(8),
                                    Content = new Label
                                        {
                                            TextColor = Color.White,
                                            LineBreakMode = LineBreakMode.TailTruncation
                                        }.FontSize(16)
                                        .Bind(convert: (EquipmentDto x) =>
                                        {
                                            var converter = new EquipmentStatusValueConverter();
                                            return converter.Convert(x, typeof(string), null, null);
                                        })
                                }
                                .Padding(new Thickness(8, 2, 8, 2))
                                .End()
                                .Bind(VisualElement.BackgroundColorProperty, convert: (EquipmentDto x) =>
                                {
                                    var converter = new EquipmentStatusColorValueConverter();
                                    return converter.Convert(x, typeof(Color), null, null);
                                }),
                        }
                    }.Row(EquipmentRow.Top).ColumnSpan(GridRowsColumns.All<EquipmentColumn>()),

                    new Label
                        {
                            LineBreakMode = LineBreakMode.TailTruncation,
                            TextColor = ColorPalette.SecondaryText
                        }.FontSize(16)
                        .Row(EquipmentRow.Bottom).Column(EquipmentColumn.Left)
                        .Bind(nameof(EquipmentDto.Model))
                        .Assign(out _modelLabel),

                    new Label
                        {
                            LineBreakMode = LineBreakMode.TailTruncation,
                            HorizontalTextAlignment = TextAlignment.End,
                            TextColor = ColorPalette.SecondaryText
                        }.FontSize(16)
                        .Row(EquipmentRow.Bottom).Column(EquipmentColumn.Right)
                        .Bind(nameof(EquipmentDto.Type.Name))
                        .Assign(out _typeLabel),
                }
            }.Padding(new Thickness(16, 8, 16, 8));
        }

        private void Bind()
        {
            var set = this.CreateBindingSet<EquipmentViewCell, EquipmentDto>();
            set.Bind(_nameLabel).To(vm => vm.Name);
            set.Bind(_typeLabel).To(vm => vm.Type.Name);
            set.Bind(_modelLabel).To(vm => vm.Type);
            set.Apply();
        }
    }
公共类设备视图单元格:MvxViewCell
{
私有标签nameLabel、modelLabel、typeLabel;
公共设备查看单元()
{
Build();
}
枚举设备行
{
顶部
底部
}
枚举设备列
{
左边
赖特
}
私有void Build()
{
视图=新网格
{
RowDefinitions=GridRowsColumns.Rows.Define(
(EquipmentRow.Top,GridLength.Auto),
(EquipmentRow.Bottom,GridLength.Auto)),
ColumnDefinitions=GridRowsColumns.Columns.Define(
(EquipmentColumn.Left,GridLength.Star),
(EquipmentColumn.Right,GridLength.Auto)),
孩子们=
{
新堆栈布局
{
方向=堆叠方向。水平,
孩子们=
{
新标签
{
LineBreakMode=LineBreakMode.TailTruncation
}
.FontSize(20).Bold()
.StartExpand()
.Bind(设备名称)
.分配(外部_名称标签),
新煎饼景观
{
转弯半径=新的转弯半径(8),
内容=新标签
{
TextColor=Color.White,
LineBreakMode=LineBreakMode.TailTruncation
}.FontSize(16)
.Bind(转换:(设备数据到x)=>
{
var转换器=新设备状态值转换器();
返回converter.Convert(x,typeof(string),null,null);
})
}
.衬垫(新厚度(8,2,8,2))
(完)
.Bind(VisualElement.BackgroundColorProperty,转换:(设备到x)=>
{
var converter=新设备状态ColorValueConverter();
返回converter.Convert(x,typeof(Color),null,null);
}),
}
}.Row(EquipmentRow.Top).ColumnSpan(GridRowsColumns.All()),
新标签
{
LineBreakMode=LineBreakMode.TailTruncation,
TextColor=colorplate.secondary文本
}.FontSize(16)
.行(设备行.底部).列(设备列.左侧)
.Bind(名称(设备型号))
.分配(输出模式标签),
新标签
{
LineBreakMode=LineBreakMode.TailTruncation,
HorizontalTextAlignment=TextAlignment.End,
TextColor=colorplate.secondary文本
}.FontSize(16)
.行(设备行.底部).列(设备列.右侧)
.Bind(名称of(设备类型名称))
.分配(输出_类型标签),
}
}.填充物(新厚度(16,8,16,8));
}
私有无效绑定()
{
var set=this.C
private void Bind()
{
    if (_didBind) return;
    _didBind = true;

    var set = CreateBindingSet();
    ...
    set.Apply();
}