Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单动态更改母版页内容_C#_Xaml_Xamarin_Xamarin.forms_Master Detail - Fatal编程技术网

C# 表单动态更改母版页内容

C# 表单动态更改母版页内容,c#,xaml,xamarin,xamarin.forms,master-detail,C#,Xaml,Xamarin,Xamarin.forms,Master Detail,我有一个简单的应用程序与主详细信息页 看起来很相似: 我想动态更改母版页内容。 例如,在“详细信息”页面上有一些按钮,然后单击它-母版页中的一些项目消失 我试图找到一些项目属性,如item1.isVisible=False,但什么也找不到 我有什么办法可以做吗 MainPagecode: public partial class MainPage : MasterDetailPage { public MainPage() { InitializeCompone

我有一个简单的应用程序与主详细信息页

看起来很相似:

我想动态更改母版页内容。 例如,在“详细信息”页面上有一些按钮,然后单击它-母版页中的一些项目消失

我试图找到一些项目属性,如
item1.isVisible=False
,但什么也找不到

我有什么办法可以做吗

MainPage
code:

public partial class MainPage : MasterDetailPage
{
    public MainPage()
    {
        InitializeComponent();
        masterPage.listView.ItemSelected += OnItemSelected;
    }

    void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as MasterPageItem;
        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            masterPage.listView.SelectedItem = null;
            IsPresented = false;
        }
    }
}
MainPage
XAML:

<MasterDetailPage xmlns=....>
<MasterDetailPage.Master>
    <views:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <views:SomePage/>
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>
    <StackLayout>
    <ListView x:Name="listView" x:FieldModifier="public" Margin="10,50,0,0">
        <ListView.ItemsSource>
            <x:Array Type="{x:Type local:MasterPageItem}">
                <local:MasterPageItem Title="Home" TargetType="{x:Type views:HomePage}" IconSource="nav_icon_home"/>
                <local:MasterPageItem Title="Settings" TargetType="{x:Type views:HomePage}" IconSource="nav_icon_settings" />
                <local:MasterPageItem Title="My Profile" TargetType="{x:Type views:HomePage}" IconSource="nav_icon_profile" />
                <local:MasterPageItem Title="Help" TargetType="{x:Type views:HomePage}" IconSource="nav_icon_help" />
                <local:MasterPageItem Title="About" TargetType="{x:Type views:AboutPage}" IconSource="nav_icon_about"/>
            </x:Array>
        </ListView.ItemsSource>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid Padding="10,10,10,10" ColumnSpacing="10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding IconSource}"/>
                        <Label Grid.Column="1" Text="{Binding Title}" TextColor="White" VerticalOptions="Center"/>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>
母版页项目:

public class MasterPageItem
{
    public string Title { get; set; }

    public string IconSource { get; set; }

    public Type TargetType { get; set; }
}
因此,我在
MasterPageItem
内部实现了
INotifyPropertyChanged

public class MasterPageItem : INotifyPropertyChanged
{
    public string Title { get; set; }

    public string IconSource { get; set; }

    public Type TargetType { get; set; }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private bool isVisible;

    public bool IsVisible
    {
        get { return isVisible; }
        set
        {
            isVisible = value;
            PropertyChanged(this, new PropertyChangedEventArgs("IsVisible"));
        }
    }

}

但是我怎样才能把它绑定到我的母版上呢?

首先,学习如何提问

您希望我们能够理解您是如何构建和修改视图的,甚至不需要显示一行代码

一般来说,您可以通过更改
Xamarin.Forms.MasterDetailPage
Master
-属性来更改母版页的视图。如果将
Xamarin.Forms.ContentPage
分配给
Master
-属性,则可以通过
((ContentPage)YourMasterDetailPage.Master).Content
访问它

我确信这个问题已经被回答了100次,并且遵循了xamarin形式的基本结构

在此从头开始学习MasterDetailPage:

由于您现在提供了一些代码,下面是一个小示例:

void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as MasterPageItem;
        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            item.IsVisible = false; //this would make the clicked item invisible
            masterPage.listView.SelectedItem = null;
            IsPresented = false;
        }
    }

最后,我实现了两个不同的母版页,以便在需要时在它们之间切换

所以我有两个
主页
第一个是指
主页1

<MasterDetailPage.Master>
    <views:MasterPage1 x:Name="masterPage1" />
</MasterDetailPage.Master>

<MasterDetailPage.Detail>
<NavigationPage>
    <x:Arguments>
        <views:SomePage1/>
    </x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>

我知道这不是最好的解决方案,但就我而言,这已经足够了。

谢谢,我已经添加了代码。这里没有100个类似的问题(或者可能我是盲人,看不见),有很多关于细节页面结构的解释,但关于母版的解释很少。尝试将“IsVisible={Binding IsVisible}”添加到ViewCell模板的网格中(母版XAML的第15行)。然后,无论何时更改特定masterpageitem上的属性,都应切换可见性。(由于bool默认值为“false”,您的项目现在应该不可见)它工作正常,元素现在不可见。但我不明白-如何更改单个项目的可见性?因为我在XAML中创建了它们。他们应该有一些
ID
还是什么?我的意思是,我当然可以将
IsVisible
添加到XAML中的各个项目中,但是如何从
cs
code设置它?如果更改MasterPageItem的值,IsVisible的绑定会将更改传播到视图中。我添加了你的一些行,并添加了一行注释。
<MasterDetailPage.Master>
    <views:MasterPage2 x:Name="masterPage2" />
</MasterDetailPage.Master>

<MasterDetailPage.Detail>
<NavigationPage>
    <x:Arguments>
        <views:SomePage2/>
    </x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>