我总体上仍在学习Xamarin Forms和C#。所以在我的MainPage.xaml中,我有这个:
<StackLayout>
<Button Text="bttn1" Clicked="Button_Clicked"/>
<Button Text="bttn2" Clicked="Button_Clicked_1"/>
<ContentView x:Name="DisplayCustomContentView">
</ContentView>
</StackLayout>
和两个ContentViews:
查看1:
public class View1 : ContentView
{
public View1 ()
{
Content = new StackLayout {
Children = {
new Label { Text = "View 1" },
new Entry {Placeholder = "entry1 View 1"},
new Entry {Placeholder = "entry2 View 1"}
}
};
}
}
查看2:
public class View2 : ContentView
{
public View2 ()
{
Content = new StackLayout {
Children = {
new Label { Text = "View 2" },
new Entry {Placeholder = "entry2 View 1"},
new Entry {Placeholder = "entry2 View 2"}
}
};
}
}
因此,我想在单击按钮时在视图之间交换。我已经尝试过了:
private void Button_Clicked(object sender, EventArgs e)
{
DisplayCustomContentView = new View1();
}
如何从Entry
字段中获取值?
我几乎可以肯定我的做法不正确。我会尽我所能获得所有帮助!
答案 0 :(得分:1)
您需要设置内容property
。
private void Button_Clicked(object sender, EventArgs e)
{
DisplayCustomContentView.Content = new View1();
}
答案 1 :(得分:1)
回答您的问题:
我如何从Entry字段中获取值?
有一个简单的答案,而不是那么简单的答案。
简单的答案是,因为您是用C#(而不是XAML)构建View1和View2,所以要存储对Entry对象的引用:
public class View1 : ContentView
{
public Entry Entry1 { get; private set; }
public Entry Entry2 { get; private set; }
public View1 ()
{
Entry1 = new Entry { Placeholder = "entry1 View 1" };
Entry2 = new Entry { Placeholder = "entry1 View 2" };
Content = new StackLayout {
Children = {
new Label { Text = "View 1" },
Entry1,
Entry2
}
};
}
}
然后,在某些按钮回调或Command中(或在程序获得控制权时),您可以查看Entry1.Text和Entry2.Text属性以查看用户输入的内容。
现在使用不是那么简单的方法MVVM和模型绑定。尽管与此相关的代码更加复杂,但这是编写Xamarin.Forms应用程序的一种非常流行的方式,因为它使您能够更好地将视图代码与其余逻辑分开。这可以帮助分离应用程序中的问题,以提高可测试性,可维护性等。您可以使用Xamarin内置功能来做到这一点,但是很多人喜欢使用各种MVVM软件包来进一步支持MVVM原理。
要使用View1(仅使用内置的Xamarin.Forms功能)进行简单说明,您还应创建一个View1ViewModel类,如下所示:
public class View1ViewModel
{
public string Entry1 { get; set; }
public string Entry2 { get; set; }
}
public class View1 : ContentView
{
public View1ViewModel ViewModel { get; private set; }
public View1 ()
{
ViewModel = BindingContext = new View1ViewModel();
var entry1 = new Entry { Placeholder = "entry1 View 1" };
var entry2 = new Entry { Placeholder = "entry1 View 2" };
entry1.SetBinding(Entry.TextProperty, "Entry1");
entry2.SetBinding(Entry.TextProperty, "Entry2");
Content = new StackLayout {
Children = {
new Label { Text = "View 1" },
entry1,
entry2
}
};
}
}
在此模型中,其他代码可以查看视图模型,而不是直接查看底层UI元素(Entry对象)上的属性,因为当条目的值更改时,这些属性会自动更新。
尽管此示例代码确实通过添加模型绑定而变得更大,但是使用XAML时它往往更加简洁。
当然,MVVM还有其他方面(INotifyPropertyChanged等),我鼓励您学习更多,但这超出了原始问题的范围。