0

UI を xaml で定義しました。以下は私のコードです。

<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>.

このBaseクラスを削除すると、機能するはずです。

編集

変更する必要があります:

       AddCourseCommand = new AddCourseCommand(this);

DelegateCommandをダウンロードする

       AddCourseCommand = new DelegateCommand(AddNewTab);

編集:

UIからViewModelを切り取ります。インスタンスをコマンドにコピーしてから、そのコピー追加を呼び出します。これは間違っており、あなたの過失を所有します。DelegateCommandを使用することをお勧めします。これで修正される可能性があります。

あなたの推測に:

なぜ不平を言っているのか私は知っていると思います。私のTextプロパティはMyHomeworkViewModelではなくMyHomeworkModelです...しかし、MyHomeworkModelのHeaderプロパティにヘッダーをバインドしても問題ないのはなぜですか?

MyHomeworkModelあなたのプロパティがあなたの中にあり、あなたの中にないのは正しいMyHomeworkViewModelです。sを含むリストにバインドしますMyHomeworkModel。次に、バインディングが最低レベルに設定する新しいアイテムを追加します。この場合、あなたの主張ではMyHomeworkModelなくMyHomeworkViewModel

于 2013-01-18T16:14:47.273 に答える