【问题标题】:Open new Tabs on a UserControl while checking the Checkboxes on a ViewModel检查 ViewModel 上的复选框时在 UserControl 上打开新选项卡
【发布时间】:2023-03-11 21:24:02
【问题描述】:

我正在尝试在 MVVM 中制作一个程序,该程序可以读取 Excel 文件并将内容生成到 Word 文件中。现在,每次有人选择在复选框上创建 Word 文件时,我都坚持在 UserControl 上创建新的 Tabs:

它应该在我的第二个UserControl 上生成一个新选项卡,我正在尝试从名为HauptfensterViewModel 的 ViewModel 生成它。

视图模型中的代码如下所示:

protected void OnWeiterExecute(object obj)
{
    OnDokumentChanged();
    new VorschauViewModel(view);
    if (Dokumenttyp[0] == true)
    {
        //TabItem auf VorschauWindow erstellen, mit jeweiligem Dokumentennamen(Angebotsvorlage)
    }
    if (Dokumenttyp[1] == true)
    {
        //TabItem auf VorschauWindow erstellen mit jeweiligem Dokumentennamen(Auditplan)
    }
    if (Dokumenttyp[2] == true)
    {
        //TabItem auf VorschauWindow erstellen mit jeweiligem Dokumentennamen(Checkliste)
    }
    if (Dokumenttyp[3] == true)
    {
        //TabItem auf VorschauWindow erstellen mit jeweiligem Dokumentennamen(Dokumentationsvorlage)
    }               
}

感谢您的帮助,如果有不明白的地方,我会尽力回答所有问题。

【问题讨论】:

  • 因为CheckBoxes有四个,所以最多加四个TabItems
  • 这两个USerControls是否在同一个Window中?
  • 实际上,您完全错过了 MVVM 概念。视图模型不应创建任何TabItems(因为它们是视图元素,视图模型不应打扰任何视图)。这一行再次证实了这一事实:new VorschauViewModel(view); - 您正在将视图传递给视图模型,这(通常)不是 MVVM-ish。
  • @Iron 是的,它应该只生成 4 个 TabItems
  • @dymanoid 好吧,我不知道,谢谢。那么我应该在我的 UserControl.cs 上生成它们吗?

标签: c# wpf mvvm tabcontrol


【解决方案1】:

您可以尝试以下示例的代码,这不是最好的解决方案,但它可以帮助您更多地了解MVVM

视图模型:

public class HauptfensterViewModel : INotifyPropertyChanged
{
    public static HauptfensterViewModel Instance { get; } = new HauptfensterViewModel();

    private HauptfensterViewModel()
    {
    }

    private bool _property1;
    private bool _property2;
    private bool _property3;
    private bool _property4;

    public bool Property1
    {
        get { return _property1; }
        set
        {
            _property1 = value;
            OnPropertyChanged();
        }
    }

    public bool Property2
    {
        get { return _property2; }
        set
        {
            _property2 = value;
            OnPropertyChanged();
        }
    }

    public bool Property3
    {
        get { return _property3; }
        set
        {
            _property3 = value;
            OnPropertyChanged();
        }
    }

    public bool Property4
    {
        get { return _property4; }
        set
        {
            _property4 = value; 
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

用户控件1:

<CheckBox IsChecked="{Binding Property1}"/>
<CheckBox IsChecked="{Binding Property2}"/>
<CheckBox IsChecked="{Binding Property3}"/>
<CheckBox IsChecked="{Binding Property4}"/>

用户控件2:

<TabControl HorizontalAlignment="Right">
    <TabControl.Resources>
        <BooleanToVisibilityConverter x:Key="ToVisibilityConverter"/>
    </TabControl.Resources>
    <TabItem Header="1" Visibility="{Binding Property1,Converter={StaticResource ToVisibilityConverter}}"/>
    <TabItem Header="2" Visibility="{Binding Property2,Converter={StaticResource ToVisibilityConverter}}"/>
    <TabItem Header="3" Visibility="{Binding Property3,Converter={StaticResource ToVisibilityConverter}}"/>
    <TabItem Header="4" Visibility="{Binding Property4,Converter={StaticResource ToVisibilityConverter}}"/>
</TabControl>

代码隐藏:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        DataContext = HauptfensterViewModel.Instance;
    }
}
public partial class UserControl2 : UserControl
{
    public UserControl2()
    {
        DataContext = HauptfensterViewModel.Instance;
    }
}

【讨论】:

  • 您的解决方案有三个糟糕的设计决策:1) 提供“有状态”对象的 static 属性; 2) 一个视图模型用于两个不同的视图; 3) 通过单例将视图连接到视图构造函数中的视图模型。代码审查团队会拒绝这样的提交。
  • 是的,这不是一个好的解决方案,只是为了帮助新手更多地了解MVVM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2013-04-03
  • 2017-01-05
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多