繁体   English   中英

通过按钮命令动态更改 tabitem 不起作用 wfp

[英]Dynamically changing tabitem via button command not working wfp

我试图在 wpf 程序中创建一个 function,我可以在其中 select 列表视图中的一个项目,然后按下一个按钮,它会更改 tabitem,然后允许我从所选的列表视图中编辑该项目。 我在为我更改 tabitem 时遇到问题。

对于我的应用程序的导航,我有一个 ViewModelBase,我的 AppointmentsViewModel 继承自它。 在 AppointmentsViewVM 内部有一个包含 4 个项目的选项卡控件,通过单击每个项目,它会为 function 加载请求的视图/视图模型。

这不是我试图让它工作的唯一方法,我目前在第 4 天。我可以让 TabIndex 更早地在 TabControl 中更改,但选项卡对我来说仍然不会更改。 所以我放弃了它并尝试了下面的路线(仍然没有运气)。

视图模型库

    namespace MBR2.ViewModels
{
    public class ViewModelBase : INotifyPropertyChanged
    { 
        public ICommand MainMenuViewDogs_Command { get; set; }
        public ICommand MainMenuViewAppointments_Command { get; set; }

        private object _SelectedViewModel;
        public object SelectedViewModel
        {
            get { return _SelectedViewModel; }
            set
            {
                _SelectedViewModel = value;
                OnPropertyChanged("SelectedViewModel");
            }
        }

        public ViewModelBase()
        {
            MainMenuViewDogs_Command = new BaseCommand(OpenDogs);
            MainMenuViewAppointments_Command = new BaseCommand(OpenAppointments);
        }

        private void OpenDogs(object obj)
        {
            SelectedViewModel = new DogsViewModel();
        }
        private void OpenAppointments(object obj)
        {
            SelectedViewModel = new AppointmentsViewModel();
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private bool _SelectedIndexView;
        public bool SelectedIndexView
        {
            get { return _SelectedIndexView; }
            set
            {
                _SelectedIndexView = value;
                OnPropertyChanged("SelectedIndexView");
            }
        }
        private bool _SelectedIndexAdd;
        public bool SelectedIndexAdd
        {
            get { return _SelectedIndexAdd; }
            set
            {
                _SelectedIndexView = value;
                OnPropertyChanged("SelectedIndexAdd");
            }
        }
        private bool _SelectedIndexEdit;
        public bool SelectedIndexEdit
        {
            get { return _SelectedIndexEdit; }
            set
            {
                _SelectedIndexView = value;
                OnPropertyChanged("SelectedIndexEdit");
            }
        }
        private bool _SelectedIndexDelete;
        public bool SelectedIndexDelete
        {
            get { return _SelectedIndexDelete; }
            set
            {
                _SelectedIndexView = value;
                OnPropertyChanged("SelectedIndexDelete");
            }
        }
    }
}

约会视图模型

{
    public class AppointmentsViewModel : ViewModelBase
    {

        private AppointmentsAddVM _AppointmentsAddVM;
        public AppointmentsAddVM AppointmentsAddVM { get { return _AppointmentsAddVM; } }
        private AppointmentsEditVM _AppointmentsEditVM;
        public AppointmentsEditVM AppointmentsEditVM { get { return _AppointmentsEditVM; } }
        private AppointmentsDeleteVM _AppointmentsDeleteVM;
        public AppointmentsDeleteVM AppointmentsDeleteVM { get { return _AppointmentsDeleteVM; } }
        private AppointmentsViewVM _AppointmentsViewVM;
        public AppointmentsViewVM AppointmentsViewVM { get { return _AppointmentsViewVM; } }

        public ObservableCollection<object> ViewModelList { get; set; }

        public AppointmentsViewModel()
        {

            this.ViewModelList = new ObservableCollection<object>();
            _AppointmentsAddVM = new AppointmentsAddVM();
            _AppointmentsEditVM = new AppointmentsEditVM();
            _AppointmentsDeleteVM = new AppointmentsDeleteVM();
            _AppointmentsViewVM = new AppointmentsViewVM();
            this.ViewModelList.Add(_AppointmentsAddVM);
            this.ViewModelList.Add(_AppointmentsEditVM);
            this.ViewModelList.Add(_AppointmentsDeleteVM);
            this.ViewModelList.Add(_AppointmentsViewVM);
        }
    }
}

AppointmentsView.xaml

<UserControl
    x:Class="MBR2.Views.AppointmentsView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
        xmlns:vms="clr-namespace:MBR2.ViewModels.Appointments"
        xmlns:views="clr-namespace:MBR2.Views.Appointments" 
        xmlns:viewmodels="clr-namespace:MBR2.ViewModels" 
        d:DataContext="{d:DesignInstance Type=viewmodels:AppointmentsViewModel}"
        mc:Ignorable="d" 
        d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <DataTemplate DataType="{x:Type vms:AppointmentsViewVM}">
            <views:AppointmentsViewView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vms:AppointmentsAddVM}">
            <views:AppointmentsAddView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vms:AppointmentsDeleteVM}">
            <views:AppointmentsDeleteView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vms:AppointmentsEditVM}">
            <views:AppointmentsEditView />
        </DataTemplate>
    </UserControl.Resources>
    <Grid x:Name="Appointments" Width="Auto" Height="Auto">
        <DockPanel HorizontalAlignment="Center" 
                   Height="Auto" 
                   LastChildFill="False" 
                   VerticalAlignment="Top" 
                   Width="Auto">
            <TabControl x:Name="VMTabControl">
                <TabItem x:Name="ViewTab"
                         TabIndex="0"
                         Header="View" 
                         IsSelected="{Binding SelectedIndexView}"
                         Content="{Binding AppointmentsViewVM}"></TabItem>
                <TabItem x:Name="AddTab"
                         TabIndex="1"
                         Header="Add"
                         IsSelected="{Binding SelectedIndexAdd}"
                         Content="{Binding AppointmentsAddVM}"></TabItem>
                <TabItem x:Name="EditTab"
                         TabIndex="2"
                         Header="Edit" 
                         IsSelected="{Binding SelectedIndexEdit}"
                         Content="{Binding AppointmentsEditVM}"></TabItem>
                <TabItem x:Name="DeleteTab"
                         TabIndex="3"
                         Header="Delete"
                         IsSelected="{Binding SelectedIndexDelete}"
                         Content="{Binding AppointmentsDeleteVM}"></TabItem>
            </TabControl>
        </DockPanel>
    </Grid>
</UserControl>

以及关联的 AppointmentsViewVM

namespace MBR2.ViewModels.Appointments
{
    public class AppointmentsViewVM : ViewModelBase, INotifyPropertyChanged
    {
        private List<AppointmentsView_Wrapper> _AppointmentsView;
        public List<AppointmentsView_Wrapper> AppointmentsView
        {
            get { return _AppointmentsView; }
            set
            {
                _AppointmentsView = value;
                OnPropertyChanged("AppointmentsView");
            }
        }
        private List<string> _NameColumn = new List<string>();
        public List<string> NameColumn
        {
            get { return _NameColumn; }
            set
            {
                _NameColumn = value;
                OnPropertyChanged("NameColumn");
            }
        }
        private List<string> _ApptDateColumn = new List<string>();
        public List<string> ApptDateColumn
        {
            get { return _ApptDateColumn; }
            set
            {
                _ApptDateColumn = value;
                OnPropertyChanged("ApptDateColumn");
            }
        }
        private List<string> _ApptTimeColumn = new List<string>();
        public List<string> ApptTimeColumn
        {
            get { return _ApptTimeColumn; }
            set 
            {
                    _ApptTimeColumn = value;
                    OnPropertyChanged("ApptTimeColumn");
            }
        }
        private List<string> _ApptVetColumn = new List<string>();
        public List<string> ApptVetColumn
        {
            get { return _ApptVetColumn; }
            set
            {
                _ApptVetColumn = value;
                OnPropertyChanged("ApptVetColumn");
            }
        }
        private List<string> _ApptCreatedColumn = new List<string>();
        public List<string> ApptCreatedColumn
        {
            get { return _ApptCreatedColumn; }
            set
            {
                _ApptCreatedColumn = value;
                OnPropertyChanged("ApptCreatedColumn");
            }
        }
        private List<int> _ApptIDColumn = new List<int>();
        public List<int> ApptIDColumn
        {
            get { return _ApptIDColumn; }
            set
            {
                _ApptIDColumn = value;
                OnPropertyChanged("ApptIDColumn");
            }
        }
        private string _AppointmentEdit_Enabled = "False";
        public string AppointmentEdit_Enabled
        {
            get { return _AppointmentEdit_Enabled; }
            set
            {
                _AppointmentEdit_Enabled = value;
                OnPropertyChanged("AppointmentEdit_Enabled");
            }
        }
        private AppointmentsView_Wrapper _ApptIDSelected;
        public AppointmentsView_Wrapper ApptIDSelected
        {
            get { return _ApptIDSelected; }
            set
            {
                AppointmentEdit_Enabled = "True";
                _ApptIDSelected = value;
                OnPropertyChanged("ApptIDSelected");
            }
        }

        public AppointmentData AppointmentData = new AppointmentData();
        public Messaging Messaging = new Messaging();

        public ICommand AppointmentsListView_Command => new DelegateCommand<object>(AppointmentsListView_Clicked);
        public ICommand EditSelection_Command => new DelegateCommand<object>(EditSelection_Clicked);

        public AppointmentsViewVM()
        {
            BuildPage();
        }

        public async void BuildPage()
        {
            AppointmentsView = await AppointmentData.Appointments_GetAll();
            foreach(var item in AppointmentsView)
            {
                ApptIDColumn.Add(item.ApptID);
                NameColumn.Add(item.DogName);
                ApptDateColumn.Add(item.ApptDate);
                ApptTimeColumn.Add(item.ApptTime);
                ApptVetColumn.Add(item.ApptVet);
                ApptCreatedColumn.Add(item.ApptCreated.ToString("dd/mm/yyyy"));
            }

        }
        public void AppointmentsListView_Clicked(object obj)
        {
            Messaging.ShowAlert(ApptIDSelected.ApptID.ToString());
        }

        public void EditSelection_Clicked(object obj)
        {
            bool result = Messaging.AskQuestion(ApptIDSelected.ApptID.ToString());
            if(result)
            {
                SelectedIndexView = false;
                SelectedIndexAdd = false;
                SelectedIndexEdit = true;
                SelectedIndexDelete = false;
                OnPropertyChanged("SelectedIndexView");
                OnPropertyChanged("SelectedIndexAdd");
                OnPropertyChanged("SelectedIndexEdit");
                OnPropertyChanged("SelectedIndexDelete");
            }
            else
            {
                Messaging.ShowAlert("no");
            }
        }
    }
}

这是您在列表框中输入 select 然后在选项卡控件中选择相应选项卡的内容的最小复制。

这是非常小的,但我们或许可以想象列表框中每个项目的更复杂的视图模型,其中包含名称和视图模型或其他内容。

这是主窗口。

<Window.Resources>
    <DataTemplate DataType="{x:Type local:Avm}">
        <local:Aview/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Bvm}">
        <local:Bview/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Cvm}">
        <local:Cview/>
    </DataTemplate>
</Window.Resources>
<Window.DataContext>
    <local:MainWindowViewmodel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <ListBox ItemsSource="{Binding ViewModels}"
             x:Name="lb"
             >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ViewModelName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <TabControl Grid.Column="1"
                ItemsSource="{Binding ViewModels}"
                SelectedItem="{Binding ElementName=lb, Path=SelectedItem, Mode=TwoWay}"
                >
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock
                Text="{Binding ViewModelName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentPresenter Content="{Binding}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Grid>

我只做了3个views和viewmodels。

请注意,列表框的选定项双向绑定到选项卡控件。 我有匹配的视图和视图模型 A、B 和 C

主窗口视图模型

public class MainWindowViewmodel : ViewModelBase
{
    public ObservableCollection<Object> ViewModels { get; set; } = new ObservableCollection<Object>{
        new Avm{ViewModelName="A viewmodel" }, 
        new Bvm{ViewModelName="B viewmodel" }, 
        new Cvm{ViewModelName="C viewmodel" }
        };
}

列表框和选项卡控件的项目源都绑定到该视图模型集合。 正如我所提到的,它们实际上非常简单。

查看模型库

public  class ViewModelBase : INotifyPropertyChanged
{
    public string ViewModelName { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

Avm、Bvm 和 Cvm 只是继承自它。

示例用户控件视图。

    <Grid>
        <TextBlock Text="{Binding ViewModelName}"/>
    </Grid>
</UserControl>

当我旋转它时,select 和 select 列表框中的一个项目匹配的选项卡被选中。 反之亦然。 Select 一个选项卡,它在列表框中选择相同的选项卡。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM