这是我将tabitem动态添加到tabcontrol的代码:
TabItem newTab = new TabItem();
newTab.Header = ncn.courseName;
newTab.FontSize = 20;
TextBox textbox = new TextBox();
textbox.HorizontalAlignment = HorizontalAlignment.Stretch;
textbox.VerticalAlignment = VerticalAlignment.Stretch;
textbox.FontSize = 12;
textbox.AcceptsReturn = true;
newTab.Content = textbox;
this.Courses.Items.Add(newTab);
this.Courses.SelectedItem = newTab;
我认为可能有更好的方法(即在xaml中定义UI)。我是WPF的新手,无法弄清楚模板的工作原理。所以请帮助我!
注意:tabcontrol在开头是空的(没有显示,没有tabitem,没有文本框)!我只想在点击“添加”按钮时添加新标签。
有人帮助我并弄清楚了。
答案 0 :(得分:0)
首先是:在所有情况下,99%的情况下最好也可以在XAML中为您编写UI。
其次,您应该告知自己,WPF指示了什么以及如何使用MVVM。如果你不这样做,你应该留在Windows Forms!
现在:
您的ViewModel:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PB.Base;
namespace DynTabItems
{
public class MainWindowViewModel
{
public MainWindowViewModel()
{
AddItemCommand = new DelegateCommand(AddItem, CanAddItem);
RemoveItemCommand = new DelegateCommand(RemoveItem, CanRemoveItem);
}
public DelegateCommand AddItemCommand { private set; get; }
public DelegateCommand RemoveItemCommand { private set; get; }
ObservableCollection<MyModel> _yourBehaviorClass = new ObservableCollection<MyModel>();
MyModel _selectetItem;
public MyModel SelectetItem
{
get { return _selectetItem; }
set { _selectetItem = value; }
}
public ObservableCollection<MyModel> YourBehaviorClass
{
get { return _yourBehaviorClass; }
set { _yourBehaviorClass = value; }
}
private void AddItem(object obj)
{
YourBehaviorClass.Add(new MyModel());
}
private bool CanRemoveItem(object obj)
{
return SelectetItem != null;
}
private bool CanAddItem(object obj)
{
return true;
}
private void RemoveItem(object obj)
{
YourBehaviorClass.Remove(SelectetItem);
}
}
}
现在你的XAML代码:
<Window x:Class="DynTabItems.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button Content="Add" Command="{Binding AddItemCommand}"/>
<Button Content="Remove" Command="{Binding RemoveItemCommand}"/>
<TabControl ItemsSource="{Binding YourBehaviorClass}" SelectedItem="{Binding SelectetItem}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding YourHeader, UpdateSourceTrigger=PropertyChanged}"/>
<Setter Property="Content">
<Setter.Value>
<StackPanel>
<TextBox Text="{Binding YourText, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
<ToolTipService.ToolTip>
<TextBlock Text="{Binding Error}"/>
</ToolTipService.ToolTip>
</TextBox>
</StackPanel>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</StackPanel>
</Window>
最后但并非最不重要的MyModel:
using PB.Base;
using PB.Interfaces;
using PB.ValidationError;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DynTabItems
{
public class MyModel : ViewModelBaseEx<MyModel>
{
public MyModel()
{
YourHeader = "You header String";
ListOfExistingErrors = new ObservableCollection<IValidationErrorInfo<MyModel>>();
ListOfExistingErrors.Add(new Error<MyModel>() { ErrorIndicator = "YourText", ErrorText = "Your Error Text", Predicate = s => string.IsNullOrEmpty(s.YourText) });
}
string _yourText;
string _yourHeader;
public string YourHeader
{
get { return _yourHeader; }
set
{
_yourHeader = value;
SendPropertyChanged(() => YourHeader);
}
}
public string YourText
{
get { return _yourText; }
set
{
_yourText = value;
SendPropertyChanged(() => YourText);
}
}
public override ObservableCollection<IValidationErrorInfo<MyModel>> ListOfExistingErrors
{
get;
set;
}
}
}
如果您需要示例项目,请与我联系。