协助我在xaml中定义UI

时间:2013-01-16 18:10:47

标签: c# wpf

这是我将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,没有文本框)!我只想在点击“添加”按钮时添加新标签。


有人帮助我并弄清楚了。

1 个答案:

答案 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;
        }
    }
}

如果您需要示例项目,请与我联系。