Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这些选项卡似乎共享同一个文本框?_C# - Fatal编程技术网

C# 为什么这些选项卡似乎共享同一个文本框?

C# 为什么这些选项卡似乎共享同一个文本框?,c#,C#,我在xaml中定义了我的UI,下面是我的代码: <TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}"> <TabControl.ItemContainerStyle&g

我在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>
还有我的viewmodel,它仍然非常简单:

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));
            }
        }
    }
}
我想我知道它为什么抱怨。我的文本属性是MyHomeworkModel不是MyHomeworkViewModel…但是为什么我可以将头绑定到MyHomeworkModel中的头属性呢

我的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();
        }
    }
}

好像你的模型实现了

ObservableCollection<MyHomeworkModel>.

下载

编辑:

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

据你猜测:

我想我知道它为什么抱怨。我的文本属性是MyHomeworkModel不是MyHomeworkViewModel…但是为什么我可以将头绑定到MyHomeworkModel中的头属性呢


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

中,您的XAML代码没有问题,您可以添加您的ViewModel和Model吗?相同的代码?还是你改变了?是的。我改变了我的模型…同样的问题,当我添加第一个标签时,我没有发现绑定错误。当我添加第二个标签时,我做了。但这是我的标签集合的模型,对吗?如果我删除它,我将没有任何对象可添加我的选项卡。第一个是正确的,但第二个是错误的。如果要更改代码中的属性,则模型应实现INotifyPropertyChanged,但如果每次更改属性时都从ObservableCollection继承,则此基类将通知所有其他属性已更改。您可以将每个对象添加到ObservaleCollection,如果其类型与此类型参数ObservaleCollection相同。你最好告诉自己AddNewTab()是无效的,因为它只是向集合中添加了一个新的HomeworkModel对象,并且此更改将反映在UI上……此外,我的AddCourseCommand构造函数将viewmodel对象作为参数……这毫无意义。ICommand只是一个简单的接口,您不能实例化接口!这很伤脑筋啊!并且没有使用AddNewTab分配AddCourseCommand。它不应该出现在函数中!请展示该类的实现。现在,你似乎用一个新的接口实例来实例你的接口,这简直是胡说八道。
ObservableCollection<MyHomeworkModel>.
       AddCourseCommand = new AddCourseCommand(this);
       AddCourseCommand = new DelegateCommand(AddNewTab);