Xamarin Forms:如何将数据从两个视图模型正确绑定到单个视图?

德拉戈斯

这是用于测试目的的短代码。问题是 UI 没有显示与 ViewModelB 绑定的标签中的文本。在调试中,当我将 xaml 中的鼠标悬停在来自标签的文本上时,我看到正确的绑定数据在那里,但 UI 根本不会显示。使用 ViewModelA 没有问题。

在 XAML 中:

<StackLayout>
  <StackLayout>
        <StackLayout.BindingContext>
            <testbinding:ViewModelA/>
        </StackLayout.BindingContext>
        <Button Command ="{Binding Get}"/>
   </StackLayout>
    <StackLayout>
        <StackLayout.BindingContext>
            <testbinding:ViewModelB/>
        </StackLayout.BindingContext>
        <Label Text="{Binding Metadata}"/>
    </StackLayout>

ViewModelA:其中 BaseViewModel 是 INotifyPropertyChanged 接口

public ViewModelA:BaseViewModel
{   
 public ViewModelA()
 {
        Get = new Command(SendText);
        vmB = new ViewModelB();
 }
 ViewModelB vmB;
 public ICommand Get { get; }
 private void SendText()
 {
     string data = "someText";
     vmB.GetMetadata(data);
 }
}

ViewModelB 是这样的:

class ViewModelB:BaseViewModel
{
    private string _metadata = string.Empty;
    public string Metadata
    {
        get { return _metadata; }
        set
        {
            _metadata = value;
            OnPropertyChanged();
        }
    }
    GetMetadata()
    {
    Metadata = "Some text";
    }
}

在 ViewModelA 中有更多我需要的属性,而在 ViewModelB 中只是一个从函数获取数据的属性。我可以从它们两个中只制作一个 ViewModel,效果很好,但我试图让它们更小、更有条理。我已经尝试了很多场景并且变得非常令人沮丧。谢谢你的帮助。

马修·亨利

在您的 xaml 文件中的第二个 StackLayout 中,您没有将它的 BindingContext 属性绑定到 ViewModelA 的 ViewModelB 实例,而是创建一个新的实例。

这是适合您的有效解决方案:

    public class ViewModelA : BaseViewModel
    {
        public ViewModelB ViewModelB { get; }
        public ICommand GetMetadataCommand { get; }

        public ViewModelA()
        {
            ViewModelB = new ViewModelB();
            GetMetadataCommand = new Command((_) => GetMetadata());
        }

        private void GetMetadata()
        {
            string data = "someText";
            ViewModelB.GetMetadata(data);
        }
    }

    public class ViewModelB : BaseViewModel
    {
        private string _metadata;
        public string Metadata
        {
            get { return _metadata; }
            set 
            {
                _metadata = value;
                OnPropertyChanged();
            }
        }

        public void GetMetadata(string data)
        {
            Metadata = data;
        }
    }

XAMl:

  <StackLayout>
        <StackLayout x:Name="StackLayout1">
            <StackLayout.BindingContext>
                <local:ViewModelA />
            </StackLayout.BindingContext>
            <Button Command ="{Binding GetMetadataCommand}"/>
        </StackLayout>
        <StackLayout BindingContext="{Binding Source={x:Reference StackLayout1}, Path=BindingContext.ViewModelB}">
            <Label Text="{Binding Metadata}" />
        </StackLayout>
    </StackLayout>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将视图的BackgroundColor属性绑定到Xamarin Forms中的视图模型?

如何将SwitchCell文本颜色绑定到Xamarin.Forms中的视图模型

Xamarin.Forms 如何将代码中的数据绑定到滑动视图(在 xaml 中工作)

如何在 Xamarin 中将数据从视图绑定到视图模型?

如何绑定到 C# Xamarin Forms 中的视图模型?

Xamarin Forms将两个属性从单个控件绑定到不同的上下文

Xamarin:如何将信息从提示传递到视图模型

我们如何将xamarin形式的通用视图模型中的列表项“网格宽度”绑定到“属性”?

MvvmCross-如何将UIView.Layer.AnyProperty(Xamarin.iOS)绑定到视图模型上的属性?

Xamarin.Forms:在两个视图之间共享渐变

在 ListView 如何将单击的对象发送回视图模型中的命令 - Xamarin Forms

Xamarin表单中的视图到不同视图模型的绑定

我们如何将数据绑定到 Xamarin Forms 中的“页脚”

更改视图模型中的 xamarin.forms 绑定

Xamarin UWP似乎绑定到错误的视图模型

将命令绑定到Xamarin.forms Xaml中的本机视图

将视图绑定到viewmodel并显示为Xamarin.Forms中的对话框页面?

将 Stepper 值绑定到相应的列表视图项的参数 - Xamarin.forms

在视图页面Xamarin中绑定多个模型

Xamarin Forms Carousel 视图绑定问题

无法在Xamarin Forms中的stacklayout中一起显示两个滚动视图

如何在Xamarin.forms Xaml中将列表视图与聊天数据绑定

xamarin 中列表视图的数据绑定

如何在 DataTemplateView 中实现“Xamarin.Forms 两个可绑定属性”?

如何定义Xamarin.Forms中彼此更新的两个可绑定属性?

如何将多个模型中的数据绑定到单个视图中的列表

Xamarin Xaml将两个以上属性绑定到TextCell

在Xamarin.Forms中,如何将同一视图模型的更改通知回上一页?(可以传递到第二页,但不能返回)

如何将命令绑定到Xamarin Forms中的条目“ Unfocused”事件