第一件事是:在 99% 的情况下,用 XAML 编写 UI 是最好的和可能的。
其次,您应该告知自己 WPF 指示什么以及如何使用MVVM。如果你不这样做,你应该留在 Windows 窗体!
所以现在:
你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;
}
}
}
如果您需要示例项目,请联系我。