0

このプログラムでは、[コースを追加] ボタンをクリックして一度に 1 つのタブを追加できます。理想的には、タブのヘッダーは入力したコース名である必要があり、タブにある textbox 内のテキストはコース名を表示する必要があります。

ただし、正しく機能していません。複数のタブを追加しようとすると、毎回次のエラー メッセージが表示されます。

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

また、他のタブのテキストを「上書き」しているようです(ヘッダーではなくテキストのみ)。たとえば、ヘッダーが「a」のタブを追加すると、そのテキストも「a」になります。次に、「B」を追加すると、2 つのタブの両方のテキスト ボックスが「B」になります。ただし、各タブ (この場合は MyHomeworkModel) の Text プロパティを出力すると、それぞれ "a" と "B" になります。

私は一日中デバッグしていますが、うまくいきません。どんな助けでも大歓迎です!

マイ ビュー (DataContext を MyHomeworkViewModel に設定):

<Window x:Class="MyHomework__MVVM_.MyHomeworkView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="My Homework" Height="450" Width="800" ResizeMode="CanMinimize">
    <Grid Margin="0,0,10,10">
        <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>
        <Button Content="Add Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="10,351,0,0" Height="50" Command="{Binding AddCourseCommand}"/>
        <Button Content="Drop Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="76" Margin="138,379,0,0" Height="22" Command="{Binding DropCourseCommand, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Save HW" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="669,351,0,0" Height="50"/>
    </Grid>
</Window>

私のモデル:

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;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

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

        public MyHomeworkViewModel(MyHomeworkView mainWindow)
        {
            allTabs = new ObservableCollection<MyHomeworkModel>();
            this.mainWindow = mainWindow;
            AddCourseCommand = new AddCourseCommand(this);
            DropCourseCommand = new DropCourseCommand(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 ICommand DropCourseCommand
        {
            get;
            private set;
        }

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

            foreach (MyHomeworkModel item in AllTabs)
            {
                Console.WriteLine(item.Text);
            }
        }

        public bool CanDrop()
        {
            return SelectedTab != null;
        }

        public void RemoveTab()
        {
            DropCourseConfirmation dcc = new DropCourseConfirmation();
            dcc.Owner = mainWindow;
            dcc.ShowDialog();
            if (dcc.drop == true)
            {
                int index = AllTabs.IndexOf(SelectedTab);
                AllTabs.Remove(SelectedTab);

                if (AllTabs.Count > 0)
                {
                    if (index == 0)
                    {
                        SelectedTab = AllTabs[0];
                    }
                    else
                    {
                        SelectedTab = AllTabs[--index];
                    }
                }
                else
                {
                    SelectedTab = null;
                }
            }
        }

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

さらにコードが必要な場合はお知らせください。

4

2 に答える 2

0

あなたDataContextはあなたが思っているものではありません。そこでエラーを読んでください。「テキスト」MyHomeworkViewModelは true である有効なプロパティではないと述べています (あなたの とは対照的にMyHomeworkModel)。

ItemContainerStyle の代わりに変更する必要があるのは、ItemsSource 内の適切なオブジェクトを として使用するItemTemplateとです。ContentTemplateDataContext

さらに、TextBox のバインドはText="{Binding Text, Mode=TwoWay}"、モデルのプロパティを変更しない必要があります。

于 2013-01-18T21:04:40.057 に答える
0

あなたの

<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="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                        <Grid>
                            <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            </TextBox>
                        </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
于 2013-01-18T21:08:39.557 に答える