0

我正在使用 MVVM 构建一个 WPF 应用程序,它包含一组我在 XMAL 文件中引用到我的 tabItemViewModel 的 observableCollection 的 tabcontrols ......问题是我所有的 tabitems 都包含相同的东西!(我的选项卡每个都包含一个文本框,如果我在一个选项卡中更改文本框的内容,我会在所有其他选项卡中看到相同的内容!如果我创建一个新选项卡,我编辑的所有内容都会消失! ) ,就像我所有的选项卡都与同一个视图模型或类似的东西相关!

我正在使用 Josh Smith 示例继续,我确信我遵循了相同的理念和架构!!!!

请问有什么帮助吗??谢谢 :) :)


my static ressources :

        <ResourceDictionary
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:view="clr-namespace:DealSaverMargo"
          xmlns:modelView="clr-namespace:ViewModelDealSaver;assembly=ViewModelDealSaver"
          >

            <DataTemplate DataType="{x:Type modelView:ClientCreationViewModel}">
                <view:ClientCreation />
            </DataTemplate>

            <DataTemplate DataType="{x:Type modelView:TabItemClientsListingModelView}">
                <view:ClientListing />
            </DataTemplate> (........)

            <DataTemplate x:Key="ClosableTabItemTemplate">
                <DockPanel >
                    <Button
                  Command="{Binding Path=CloseCommand}"
                Content="X"
                Cursor="Hand"
                DockPanel.Dock="Right"
                Focusable="False"
                FontFamily="Courier"
                FontSize="9"
                FontWeight="Bold"
                Margin="0,1,0,0"
                Padding="0"
                VerticalContentAlignment="Bottom"
                Width="16" Height="16"
                />
                    <ContentPresenter Content="{Binding Path=Header}"
                VerticalAlignment="Center">
                    </ContentPresenter>
                </DockPanel>
            </DataTemplate>

            <DataTemplate x:Key="TabsTemplate">
                <TabControl
              IsSynchronizedWithCurrentItem="True"
              ItemsSource="{Binding}"
              ItemTemplate="{StaticResource ClosableTabItemTemplate}"
              Margin="4"
              />
            </DataTemplate>




    </ResourceDictionary>

My MainWindowViewModel : 




public class MainWindowViewModel : ViewModelBase
{
    //Propriétés
    ObservableCollection<TabViewModel> _tabItems;

   //Propriétés publiques: 
    public ObservableCollection<TabViewModel> Workspaces
    {
        get
        {
            if (_tabItems == null)
            {
                _tabItems = new ObservableCollection<TabViewModel>();
                _tabItems.CollectionChanged += this.OnWorkspacesChanged;
            }
            return _tabItems;
        }
    }

    void OnWorkspacesChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null && e.NewItems.Count != 0)
            foreach (TabViewModel workspace in e.NewItems)
                workspace.RequestClose += this.OnWorkspaceRequestClose;

        if (e.OldItems != null && e.OldItems.Count != 0)
            foreach (TabViewModel workspace in e.OldItems)
                workspace.RequestClose -= this.OnWorkspaceRequestClose;
    }
    void OnWorkspaceRequestClose(object sender, EventArgs e)
    {
        TabViewModel workspace = sender as TabViewModel;
        workspace.Dispose();
        this.Workspaces.Remove(workspace);
    }
    public MainWindowViewModel()
    {
        _tabItems = new ObservableCollection<TabViewModel>();
        //Assignation des commandes: 
        _clientCreationCommand = new RelayCommand(new Action<object>(ClientCreationTabCommand));
        _dealCreationCommand = new RelayCommand(new Action<object>(DealCreationTabCommand));
        _clientsManagementCommand = new RelayCommand(new Action<object>(ClientListingTabcommand));
    }
    #region //Commandes :

    public ICommand _clientCreationCommand
    {
        get;
        set;
    }

    public ICommand _dealCreationCommand
    {
        get;
        set;
    }

    public ICommand _clientsManagementCommand
    {
        get;
        set;
    }

    #endregion
    #region //Gestion des commandes :
    /// <summary>
    /// Rajout des workspaces :
    /// </summary>
    /// <param name="param"></param>
    public void ClientCreationTabCommand(object param)
    {
        TabViewModel clientsManager = new ClientCreationViewModel("Client Creation");
        _tabItems.Add(clientsManager);
        ICollectionView collection = CollectionViewSource.GetDefaultView(_tabItems);
        collection.MoveCurrentTo(clientsManager); //the corresponding view is set to active. 

    }

    public void ClientListingTabcommand(object param)
    {
        TabViewModel clientsListing = new TabItemClientsListingModelView("Client Management");
        _tabItems.Add(clientsListing);
        ICollectionView collection = CollectionViewSource.GetDefaultView(_tabItems);
        collection.MoveCurrentTo(clientsListing); //the corresponding view is set to active. 
    }
    #endregion


}


my Client Creation user control : 



     <UserControl x:Class="DealSaverMargo.ClientCreation"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                xmlns:view="clr-namespace:DealSaverMargo.Views">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="6*"/>
                    <RowDefinition Height="1*"/>
                </Grid.RowDefinitions>
                <Label Content="Deals Database" Grid.Row="0" FontSize="20" FontWeight="Bold" Background="#FFBFBFBF"></Label>

                <Grid Grid.Row="1" VerticalAlignment="Center">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <!--Définition des elements-->
                    <Label Content="ID" HorizontalAlignment="Left" Width="90" />
                    <TextBox x:Name="ID" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" Margin="3"></TextBox>
                    <Label Grid.Row="1" Content="Social Identity" HorizontalAlignment="Left" Width="90" />
                    <TextBox x:Name="socialIdentityBox" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="3"></TextBox>
                    <Label Grid.Column="0" Grid.Row="2" Content="Phone Number"/>
                    <TextBox x:Name="phoneNumberBox" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" Margin="3"></TextBox>
                    <Label Grid.Column="0" Grid.Row="3" Content="Mail Address"/>
                    <TextBox x:Name="mailAddressBox" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Stretch" Margin="3"></TextBox>
                    <Label Grid.Column="0" Grid.Row="4" Content="Created By"/>
                    <TextBox x:Name="createdByBox" Grid.Column="1" Grid.Row="4" HorizontalAlignment="Stretch" Margin="3"></TextBox>
                </Grid>
                <Grid Grid.Row="2">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*"></ColumnDefinition>
                            <ColumnDefinition Width="1*"></ColumnDefinition>
                            <ColumnDefinition Width="1*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Button Grid.Column="1" Margin="5" Content="Add"></Button>
                        <Button Grid.Column="2" Margin="5" Content="Cancel"></Button>
                    </Grid>
                </Grid>
            </Grid>
        </UserControl>

My client creation viewmodel :




        public class ClientCreationViewModel : TabViewModel
            {
                public ClientCreationViewModel(string header)
                    : base(header)
                {
                }
                private string _socialIdentity;
                public string SocialIdentity
                {
                    get
                    {
                        return this._socialIdentity;
                    }
                    set
                    {
                        if (_socialIdentity != value)
                        {
                            _socialIdentity = value;
                            OnPropertyChanged("SocialIdentity");
                        }
                    }
                }

                private string _phone;
                public string Phone
                {
                    get
                    {
                        return _phone;
                    }
                    set
                    {
                        if (value != _phone)
                        {
                            _phone = value;
                            OnPropertyChanged("Phone");
                        }
                    }
                }

                private string _mail;
                public string Mail
                {
                    get
                    {
                        return _mail;
                    }
                    set
                    {
                        _mail = value;
                        OnPropertyChanged("Mail");
                    }
                }

                private string _createdBy;
                public string CreatedBy
                {
                    get
                    {
                        return _createdBy;
                    }
                    set
                    {
                        if (value != _createdBy)
                        {
                            OnPropertyChanged("CreatedBy");
                        }
                    }
                }
            }


    and my tabviewmodel ( from which all my tabitems inherits)


            public class TabViewModel : ViewModelBase
            {

                //Fields : 
                RelayCommand _closeCommand;


                //Constructor:
                public TabViewModel(string header)
                {
                    this.Header = header;
                }


                #region CloseCommand

                /// <summary>
                /// Returns the command that, when invoked, attempts
                /// to remove this workspace from the user interface.
                /// </summary>
                public ICommand CloseCommand
                {
                    get
                    {
                        if (_closeCommand == null)
                            _closeCommand = new RelayCommand(param => this.OnRequestClose());

                        return _closeCommand;
                    }
                }

                #endregion // CloseCommand

                #region RequestClose [event]

                /// <summary>
                /// Raised when this workspace should be removed from the UI.
                /// </summary>
                public event EventHandler RequestClose;

                void OnRequestClose()
                {
                    EventHandler handler = this.RequestClose;
                    if (handler != null)
                        handler(this, EventArgs.Empty);
                }

                #endregion // RequestClose [event]

                public String Header { get; set; }


            }


The viewmodelbase is the classic modelbase which can be found everywhere in internet :D

Thanks !!!!

@David 这是我的主窗口 XXAML

<Window.DataContext>
        <!-- Declaratively create an instance of our MainWindowVie -->
        <modelView:MainWindowViewModel></modelView:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
        <ResourceDictionary Source="MainWindowRessources.xaml"/>  
    </Window.Resources>
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_Application" >
                <MenuItem Header="_Deal Creation" Command="{Binding Path=_dealCreationCommand}"/>
                <MenuItem Header="_Client Creation" Command="{Binding Path=_clientCreationCommand}" />

                <MenuItem Header="Clients _Managment" Command="{Binding Path=_clientsManagementCommand}"/>
                <MenuItem Header="_Sectors Management"/>
                <MenuItem Header="S_tatistics"/>
                <Separator></Separator>
                <MenuItem Header="_Exit"/>
            </MenuItem>

            <MenuItem Header="Help">
                <MenuItem Header="Help"/>
                <MenuItem Header="Deal Saver"/>
            </MenuItem>
        </Menu>


        <ContentControl Content="{Binding Path=Workspaces}" ContentTemplate="{StaticResource TabsTemplate}" >

        </ContentControl>
    </DockPanel>
4

1 回答 1

0

看起来您缺少 ClientCreation 用户控件中文本框的 Text 属性的数据绑定。

例如:

<TextBox x:Name="socialIdentityBox" Text="{Binding SocialIdentity, Mode=TwoWay}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="3" />

尝试设置这些,看看会发生什么。

于 2013-02-25T21:09:01.020 回答