0

我在 xaml 中定义了我的 UI,下面是我的代码:

<TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Header}"/>
                <Setter Property="Content">
                    <Setter.Value>
                        <Grid>
                            <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            </TextBox>
                        </Grid>
                    </Setter.Value>
                </Setter>
                <Setter Property="FontSize" Value="20"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>

当我运行我的程序时。我可以毫无问题地添加许多标签。标题是不同的,但是每当我更改其中一个选项卡中文本框的内容时,其他选项卡中的所有文本框都更改为相同的内容(似乎它们都共享相同的文本框,或者绑定到相同的源,这很奇怪) .

我在定义 UI 时犯了错误吗?请帮助我,并提前感谢。

这是我的模型,非常简单:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace MyHomework__MVVM_
{
    class MyHomeworkModel : INotifyPropertyChanged
    {
        private string header, text;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Header
        {
            get
            {
                return header;
            }
            set
            {
                header = value;
                OnPropertyChanged("Header");
            }
        }

        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

还有我的视图模型,它仍然非常简单:

using MyHomework;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

namespace MyHomework__MVVM_
{
    class MyHomeworkViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<MyHomeworkModel> allTabs;
        private MyHomeworkModel selectedTab;
        public event PropertyChangedEventHandler PropertyChanged;

        public MyHomeworkViewModel()
        {
            allTabs = new ObservableCollection<MyHomeworkModel>();
            selectedTab = new MyHomeworkModel();
            AddCourseCommand = new AddCourseCommand(this);
        }

        public ObservableCollection<MyHomeworkModel> AllTabs
        {
            get
            {
                return allTabs;
            }
            set
            {
                allTabs = value;
                OnPropertyChanged("AllTabs");
            }
        }

        public MyHomeworkModel SelectedTab
        {
            get
            {
                return selectedTab;
            }
            set
            {
                selectedTab = value;
                OnPropertyChanged("SelectedTab");
            }
        }

        public ICommand AddCourseCommand
        {
            get;
            private set;
        }

        public void AddNewTab()
        {
            NewCourseName ncn = new NewCourseName();
            ncn.ShowDialog();
            if (ncn.courseName != null)
            {
                MyHomeworkModel newTab = new MyHomeworkModel();
                newTab.Header = ncn.courseName;
                newTab.Text = ncn.courseName;
                AllTabs.Add(newTab);
                SelectedTab = newTab;
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

编辑:刚刚注意到我收到了这条消息:

System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MyHomeworkViewModel' (HashCode=31265986)'. BindingExpression:Path=Text; DataItem='MyHomeworkViewModel' (HashCode=31265986); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')

我想我知道它为什么抱怨。我的 Text 属性是 MyHomeworkModel 而不是 MyHomeworkViewModel ...但是为什么我可以将标题绑定到 MyHomeworkModel 中的 Header 属性?

我的 AddCourseCommand 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MyHomework__MVVM_
{
    class AddCourseCommand : ICommand
    {
        private MyHomeworkViewModel viewModel;

        public AddCourseCommand(MyHomeworkViewModel viewModel)
        {
            this.viewModel = viewModel;
        }

        public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
            }
            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            viewModel.AddNewTab();
        }
    }
}
4

1 回答 1

0

看起来你的模型实现了

ObservableCollection<MyHomeworkModel>.

删除这个基类,它应该可以工作。

编辑

你需要改变:

       AddCourseCommand = new AddCourseCommand(this);

下载委托命令

       AddCourseCommand = new DelegateCommand(AddNewTab);

编辑:

你从你的 UI 中剪切你的 ViewModel。您将一个实例复制到您的命令中,然后调用该复制添加。这是错误的,你的错。我真的建议您使用 DelegateCommand 这可能会解决它。

根据你的猜测:

我想我知道它为什么抱怨。我的 Text 属性是 MyHomeworkModel 而不是 MyHomeworkViewModel ...但是为什么我可以将标题绑定到 MyHomeworkModel 中的 Header 属性?

正确的是,您的属性在MyHomeworkModel而不是在MyHomeworkViewModel您绑定到包含MyHomeworkModels 的列表上。现在是您添加一个新项目,您的绑定将设置在最低级别。在这种情况下,在你的情况下MyHomeworkModel而不是在MyHomeworkViewModel

于 2013-01-18T16:14:47.273 回答