![](/img/trans.png)
[英]Show dialog from ViewModel in ReactiveUI Avalonia (MVVM)
[英]How to show a Content Dialog with multiple input fields from viewmodel
我正在构建一个C# UWP应用程序,在视图中单击一个按钮,一个命令(使用 System.Windows.Input.IComand)在视图模型(不是代码隐藏)中引发,它构建了一种输入字段形式,如Name:____
phone:____
等并将其显示在 UI/视图上。
<ContentDialog></ContentDialog>
。到目前为止我所做的是
在我看来按钮:
<CommandBar>
<AppBarButton x:Name="buttonNew" Command="{Binding AddClick}" />
</CommandBar>
在视图模型中:
public ICommand AddClick=> new RelayCommand(Add);
private async void Add()
{
TextBox input = new TextBox()
{
PlaceholderText = "Name",
};
var contentDialog = new ContentDialog
{
Title = "Add a Person",
Content = input,
FullSizeDesired = true,
PrimaryButtonText = "Add",
CloseButtonText = "Cancel"
};
await contentDialog.ShowAsync();
}
如您所见,我能够显示/触发一个带有一个输入字段和 2 个按钮的内容对话框。
我的问题是:
<StackPanel></StackPanel>
在视图模型的代码中赋值给Content Dialog的内容?从一般的应用程序构建实践来看,建议使用 XAML 创建 UI 来创建自定义ContentDialog
。
您不必在 View 中编写ContentDialog
的 XAML 代码,您可以在 Visual Studio 中添加新项,选择内容对话框模板,并创建从ContentDialog
派生的自定义对话框。
然后使用类似于以下的代码:
我的自定义对话框.xaml
<ContentDialog
...
Title="Add a Person"
FullSizeDesired="True"
PrimaryButtonText="Add"
CloseButtonText="Cancel"
PrimaryButtonClick="ContentDialog_PrimaryButtonClick">
<StackPanel>
<TextBox Header="Name" x:Name="NameBox" PlaceholderText="Name"
HorizontalAlignment="Stretch"/>
<TextBox Header="Phone" x:Name="PhoneBox" PlaceholderText="Phone"
Margin="0,15,0,0" HorizontalAlignment="Stretch"
InputScope="Number"/>
</StackPanel>
</ContentDialog>
视图模型.cs
private async void Add()
{
var dialog = new MyCustomDialog();
await dialog.ShowAsync();
}
如果坚持使用C#代码创建ContentDialog
,则需要将XAML中的标签转换成对应的类,但是这种方法调试起来并不方便。
private async void Add()
{
var container = new StackPanel();
TextBox nameBox = new TextBox()
{
PlaceholderText = "Name",
Header = "Name",
HorizontalAlignment = HorizontalAlignment.Stretch
};
TextBox phoneBox = new TextBox()
{
PlaceholderText = "Phone",
Header = "Phone",
HorizontalAlignment = HorizontalAlignment.Stretch,
Margin = new Thickness(0, 15, 0, 0)
};
container.Children.Add(nameBox);
container.Children.Add(phoneBox);
var contentDialog = new ContentDialog
{
Title = "Add a Person",
Content = container,
FullSizeDesired = true,
PrimaryButtonText = "Add",
CloseButtonText = "Cancel"
};
await contentDialog.ShowAsync();
}
XAML中的标签其实就是C#中对应的类,从你提供的代码来看, ContentDialog
是全屏显示的。 您提到您希望字段正确显示,如果您的意思是在TextBox
输入的字符串太长并且文本未完全显示,您可以将TextBox.TextWrapping
属性设置为True 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.