【问题标题】:wpf- dynamically create and add new textbox and textblock to grid row when button clickedwpf-单击按钮时动态创建新文本框和文本块并将其添加到网格行
【发布时间】:2017-02-08 01:03:44
【问题描述】:

我有一个网格布局。每行有三列。第 1 列包含一个 TextBox,第 2 列和第 3 列包含 TextBlock。

我添加了一个新按钮,我想要做的是,每当用户单击该按钮时,它会生成一个新行,该行在第一列包含一个 TextBox,第二列和第三列包含 TextBlock。

我正在这样做 ss 我想获取用户在每个文本框上输入的值(名称),然后做一些网络调用服务以检索相关值 以显示在同一行的两个 TextBlock 上。

我已经搜索了一些与此相关的 stackoverflow 线程,但主要建议您通过将新控件(例如文本框)作为子控件添加到网格布局而不是使用 MVVM 来实现事件处理程序 buttonClicked()。

我想知道是否有任何方法可以使用 MVVM 实现这一目标?有什么建议吗?

【问题讨论】:

  • 不了解您的应用程序,但是,您是否考虑过使用 DataGrid?
  • 我想在 MVVM 中这样做会很累。这并不容易,而且 MVVM 已经足够复杂了(我认识的大多数人都尽量远离它,而他们只使用 Model-&-View)。按钮的事件是您最简单的方法
  • 我不会说 MVVM 令人筋疲力尽,有一些设置,但一旦你安装到位,它就会简化事情。这个答案 (stackoverflow.com/a/24961352/4490) 似乎提供了使用 MVVM 的解决方案。
  • 感谢 cmets。我实际上正在实施一个表格。在表单中有 CheckBoxes、一个 Submit Button、一个 Add 按钮和一组 textbox 供用户输入“名称”两个 TextBlock 在同一个网格行...输入名称的文本框实际上是我正在谈论的那个。
  • 我有一个添加按钮的原因是表单应该允许用户提供多个“名称”,所以当用户点击添加按钮时,它应该生成一个新的 文本框 用于输入新名称,我猜它应该绑定到列表或可观察集合?因为我想获取用户在每个 Textbox 上输入的值(名称),然后执行一些 Web Service Called 以检索相关值以显示在两个 TextBlocks 上。正如 Ramin 提到的 DataGrid,我正在查看 DataGrid 的文档并考虑是否应该使用它而不是网格。

标签: c# wpf xaml mvvm textbox


【解决方案1】:

仔细阅读上面的 cmets @benPearce 指出了对同一问题 dynamically add controls 的出色回答。希望下面的一些额外信息仍然会有所帮助。

要动态添加控件,请使用 ItemsControl 或派生类,并绑定到您想要使用的视图模型的集合。这只是一个真实的基本示例,为简洁起见省略了一些样板:

XAML

<Window x:Class="MyWpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        <Button Content="Add New Entry" Command="{Binding AddNewEntryCommand}"/>
        <ItemsControl Grid.Row="1" ItemsSource="{Binding TextEntryItems}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Label}"/>
                        <TextBox Text="{Binding Data}"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

C#

namespace MyWpfApp {
    public class MainWindowViewModel : INotifyPropertyChanged {

        private void AddNewEntry() {
            TextEntryItems.Add(new TextEntryViewModel("NewItem"));
        }

        private ObservableCollection<TextEntryViewModel> textEntryItems;
        public ObservableCollection<TextEntryViewModel> TextEntryItems { get { return textEntryItems; } set { textEntryItems = value; FirePropertyChanged(); } }

        public ICommand AddNewEntryCommand { get { new RelayCommand(AddNewEntry)} }
    }

    public class TextEntryViewModel : INotifyPropertyChanged {

        public TextEntryViewModel(string label) {
            Label = label;
        }

        private string label;
        public string Label { get { return label; } set { label = value; FirePropertyChanged(); } }

        private string data;
        public string Data { get { return data; } set { data = value; FirePropertyChanged(); } }        
    }

}

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2011-12-02
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多