XF通过xaml将数据从popuppage绑定到内容页面

时间:2017-10-23 08:13:57

标签: data-binding xamarin.forms

我的应用程序中有一个弹出页面,其中包含一些复选框,我的MainPage中还有一个包含一些stacklayout的ContentPage,我想将stacklayout的IsVisible属性绑定到我的复选框的IsChecked属性(这是在另一页),但我不知道该怎么做,有人可以帮忙吗? 我试过这个,但它不起作用

这是我的弹出页面中的代码:

 <StackLayout Orientation="Horizontal" Spacing="60">
            <local:Checkbox x:Name="va1Checkbox"  Text="VA1"/>
            <local:Checkbox x:Name="va2Checkbox" Text="VA2"/>             
        </StackLayout>

这是我在MainPage中的代码片段:

      <StackLayout   IsVisible="{Binding Source={x:Reference 
                                               va1Checkbox},Path=IsChecked}">

      </StackLayout>

提前致谢

2 个答案:

答案 0 :(得分:2)

<StackLayout Orientation="Horizontal" Spacing="60">
    <local:Checkbox x:Name="va1Checkbox"  Text="VA1"/>
    <local:Checkbox x:Name="va2Checkbox" Text="VA2"/>             
</StackLayout>

我相信您的弹出窗口代表某种设置,您可以根据这些设置控制主页面中的StackLayout

如果是这种情况,有两种可能的解决方案。

  1. 创建一个单独的类,它对复选框和布局都绑定。你可以将它用于MVVM或不用它。

  2. 价值传递:从主页面打开弹出窗口并注册到其关闭事件。当弹出窗口关闭时,您可以使用其复选框的值来启用/禁用布局。

  3. 在Popup.xaml.cs中:

    创建一个事件动作

    public event Action<Popup> OnClose;
    

    我相信你会有办法关闭它。我不知道你正在关闭它,所以我将在这里使用OnBackButtonPressed()

    protected override bool OnBackButtonPressed()
    {
        OnClose?.Invoke(this);
        return base.OnBackButtonPressed();
    }
    

    在MainPage.xaml.cs中:

    private void OpenPopup()
    {
        var popup = new PopupPage();
        popup.OnClose += OnPopupClosed;
    }
    
    void OnPopupClosed(Popup popup)
    {
        yourStackLayout.IsVisible = popup.va1Checkbox.Value;
    }
    

    <强>更新

    您可以传递自定义数据类而不是弹出对象:

    public class PopupData
    {
        public bool va1CheckboxValue;
        public bool va1CheckboxValue;
        // other data which you need to access in other page.
    }
    

    然后

    public event Action<PopupData> OnClose;
    

    protected override bool OnBackButtonPressed()
    {
        PopupData data = new PopupData() { va1CheckboxValue = va1Checkbox.Value; }
        OnClose?.Invoke(data);
        return base.OnBackButtonPressed();
    }
    

    并在主页中:

    void OnPopupClosed(PopupData data)
    {
        yourStackLayout.IsVisible = data.va1CheckboxValue;
    }
    

    希望这有帮助。

答案 1 :(得分:0)

我不太了解XAML和MVVM,但我认为你可以将MainPage的ViewModel传递给Popup ......如果你在Popup中更改MainPage的ViewModel属性,我认为这些更改也会反映到MainPage的绑定控件。

如果你没有使用MVVM(你应该......),我认为你必须将对MainPage中使用的属性的引用传递给Popup ......这样,Popup可以改变MainPage的属性,它的UI可能会改变< / p>