协助我在xaml中定义UI
本文关键字:定义 UI xaml | 更新日期: 2023-09-27 17:53:36
这是我动态添加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,没有文本框)!我想添加新的选项卡只有当我点击"添加"按钮。
有人帮我弄明白了。
第一件事是:在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;
}
}
}
如果你需要的例子项目联系我。