我有三个文本框名为TxtDocumentTitle1,TxtDocumentTitle2,TxtDocumentTitle3 最后有一个Add More按钮。客户端可以单击“添加更多按钮”,以便生成命名为TxtDocumentTitle4的文本框。如果需要他/她可以添加更多文本框。
查看
的XAML代码示例<Grid Height="450" Width="700" Background="White">
<TextBlock Height="23" HorizontalAlignment="Left" Margin="67,20,0,0" Name="textBlocKname" Text="Document Title1:" VerticalAlignment="Top" Width="110" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="67,87,0,0" Name="textBlockAddress" Text="Document Title2:" VerticalAlignment="Top" Width="110" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="67,154,0,0" Name="textBlockCompanyName" Text="Document Title3:" VerticalAlignment="Top" Width="110" />
<TextBox Height="46" Margin="67,37,87,0" Name="txtDocumentTitle1" VerticalAlignment="Top" FontSize="24" />
<TextBox Height="46" HorizontalAlignment="Left" Margin="67,106,0,0" Name="txtDocumentTitle3" VerticalAlignment="Top" Width="546" FontSize="24" />
<TextBox Height="46" HorizontalAlignment="Left" Margin="67,171,0,0" Name="txtDocumentTitle2" VerticalAlignment="Top" Width="546" FontSize="24" />
<Button Content="Add More" Height="37" HorizontalAlignment="Right" Margin="0,223,87,0" Name="btnAddmore" VerticalAlignment="Top" Width="102" />
</Grid>
答案 0 :(得分:0)
您可以通过Binding
轻松完成此操作。如果您的Window没有ViewModel,请打开窗口的xaml.cs并将其设为:
public Window1()
{
InitializeComponent();
DataContext = this;
}
public ObservableCollection<TextBoxVm> Items { get { return _items; } }
private ObservableCollection<TextBoxVm> _items = new ObservableCollection<TextBoxVm>();
如果没有,只需将最后两行添加到窗口的viewModel中。
现在您需要定义一个派生自DependencyObject
的类,并将其命名为TextBoxVm
。在其中创建两个DependencyProperty
(使用propdp片段),如下所示:
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(TextBoxVm), new UIPropertyMetadata("default text",
(d,e)=>
{
var vm = (TextBoxVm)d;
var val = (string)e.NewValue;
MyDataService.FindAndUpdateItemInDatabase(vm.Id, val);//you can access database with something like this
}));
public string TitleText
{
get { return (string)GetValue(TitleTextProperty); }
set { SetValue(TitleTextProperty, value); }
}
public static readonly DependencyProperty TitleTextProperty =
DependencyProperty.Register("TitleText", typeof(string), typeof(TextBoxVm), new UIPropertyMetadata("default title"));
这将是xaml代码:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding TitleText}"/>
<TextBox Text="{Binding Text}"/>
</WrapPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在唯一剩下的就是编写Button逻辑。只需在单击Button时将TextBoxVm添加到Items。
Items.Add(new TextBoxVm {
TitleText = string.Format("Document Title{0}:", Items.Count+1)
});
这种方法是标准MVVM(期望按钮点击事件,应使用Command
完成)。因此,如果您想在代码中添加控件(不推荐),请搜索:
以编程方式将控件添加到wpf网格。
答案 1 :(得分:0)
* Bizz的上述答案给出了我的问题的解决方案* 除此之外,在我很少研究之后我发现了关于依赖性对象的问题,我找到了一个关于依赖性对象的问题。对我这样的WPF新人来说是有帮助的:)
什么是DependencyObject ??
依赖关系对象是所有WPF对象的基础对象。像Buttons TextBox等所有的UI元素以及Paragraph,Italic,Span等内容元素都是从Dependency Object派生的。
依赖项对象用于WPF属性系统。默认情况下,我们在DOT Net CLR中拥有的属性系统是非常基本的。但依赖属性提供了许多附加功能/服务来支持数据绑定。
将任何属性创建为依赖项属性后,您将自动获得以下功能。即。更改通知,验证,回调,继承,数据绑定,样式,默认值等。
如果您需要自己为所有需要这些功能的属性实现所有这些功能,那么这将是一个很大的过程,让您感到痛苦。所以,这些都是Dependency Object类的开箱即用。
基本上依赖对象类包含字典。因此,当设置任何值或检索值时,它将更改值或从该词典中读取。所以,它只不过是一个关键的价值对。
详细信息abouT DependencyObject
http://www.codeproject.com/Articles/140620/WPF-Tutorial-Dependency-Property http://www.pinfaq.com/32/what-is-dependency-object-in-wpf-where-should-i-use-it