Xamarin:绑定ContentView内容无效,实现错误

时间:2018-06-21 07:12:01

标签: xamarin mvvm binding

我需要帮助,以了解如何将ContentView的Content绑定到我的Xamarin页面。我尝试了20种不同的方法,并且只有在不使用绑定并直接设置属性的情况下,我才能使绑定的contentview呈现。

<ContentPage.Content>
    <Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="GridLayout" RowSpacing="0" ColumnSpacing="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="60" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <nav:NavView Grid.Row="0" Grid.Column="0" Padding="0,0,0,0" Margin="0,0,0,0" HorizontalOptions="FillAndExpand"  VerticalOptions="StartAndExpand"
                      HeightRequest="60" x:Name="nav"/>
        <ContentView BindingContext="{Binding MainView}" Grid.Row="1" Grid.Column="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
    </Grid>
</ContentPage.Content>

然后下面是我的代码

public partial class DetailLayoutView : ContentPage, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string name)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
    private ContentView mainView;
    public ContentView MainView
    {
        get { return mainView; }
        set
        {
            mainView = value;
            OnPropertyChanged("MainView");
        }
    }

    public DetailLayoutView()
    {
        InitializeComponent ();
        MainView = new PyxusChatView();
        BindingContext = MainView;
    }
}

有人可以帮助我指引正确的方向吗?我目前没有足够的带宽来实现整个MVVM重构,我只想知道如何使用最少的代码来实现此功能。

1 个答案:

答案 0 :(得分:0)

检测以下提供了UI和Android的UI ...

public DetailLayoutView()
    {
        InitializeComponent ();
        MainContentArea.LayoutChanged += MainContentArea_LayoutChanged;
    }

    private void MainContentArea_LayoutChanged(object sender, EventArgs e)
    {
       Device.BeginInvokeOnMainThread(() => {
           //UI Is now visible, send a msg to let everyone subscribed to "UpdateDetailView" event now that the
           //detail page was changed and it is now okay to make API calls!
           MessagingCenter.Send<ContentView, string>(MainView, "UpdateDetailView", "From BlePairingViewModel");
       });
    }

您现在已经发送了味精,您可以进行API调用并且您的UI是可见的,而无需MVVM ...尽管MVVM可以使个人获得更多的编码,这是更好的实践。

MessagingCenter.Subscribe<ContentView, string>("Pyx", "UpdateDetailView", (sender, arg) =>
        {
            if (sender == this)
            {
                Task.Run(async () =>
                {
                    await OnAppearing();
                });
            }
        });

我不建议这样做,但它可以回答问题