Wpf 如何将富文本框添加到选项卡项,以便可以将其添加到MVVM中的选项卡控件?

Wpf 如何将富文本框添加到选项卡项,以便可以将其添加到MVVM中的选项卡控件?,wpf,mvvm,tabcontrol,tabitem,Wpf,Mvvm,Tabcontrol,Tabitem,如何将RichTextBox添加到选项卡项,以便可以将其添加到选项卡控件,并以MVVM格式动态显示RichTextBox中的相应内容 视图模型 看法 我使用了这段代码,工作正常,这不在MVVM中,这是WAF体系结构,因为我使用的是MVVM概念。你没有想到MVVM。在ViewModel中,您不会直接访问UI元素,而是希望设置能够正确呈现ViewModel的绑定和数据模板。正确的方法是使用两个viewmodels,一个用作主视图,另一个用作每个选项卡的底层DataContext 一个简单的例子如下:

如何将RichTextBox添加到选项卡项,以便可以将其添加到选项卡控件,并以MVVM格式动态显示RichTextBox中的相应内容

视图模型

看法


我使用了这段代码,工作正常,这不在MVVM中,这是WAF体系结构,因为我使用的是MVVM概念。

你没有想到MVVM。在ViewModel中,您不会直接访问UI元素,而是希望设置能够正确呈现ViewModel的绑定和数据模板。正确的方法是使用两个viewmodels,一个用作主视图,另一个用作每个选项卡的底层DataContext

一个简单的例子如下:

主视图模型

在本例中,主视图模型不了解视图,只向其自己的ObservableCollection添加项。TabControl本身通过绑定到TextTabs,添加自己的选项卡项,并使用ItemTemplate和ContentTemplate属性呈现它们


下载代码

这与MVVM不兼容-在您的ViewModel中不能有TabItem或任何与gui相关的元素抱歉,这不是MVVM,只是MVVM概念,我在上面使用它意味着什么!==>你不能这样做,因为包含的是gui元素——它正在等待与datatemplate关联的类——你混合了一切……它工作正常,它是架构,即WAF,但问题是richtextbox没有添加到我们已经做过传统WPF的Tabitem中。你不能这样做,因为包含的是gui元素否我使用的是MVVM概念,但实际上它是架构WAF。所以我想在每个选项卡中添加RichTextBox,这些选项卡已经绑定到Tabcontrol,正如我在问题中提到的。所以请修改你的答案@MarkGreen@Ajay,如果您查看我的答案,您将看到每个选项卡都有一个RichTextBox。它包含在每个选项卡项的ContentTemplate中。这是正确的方法。
private ObservableCollection<TabItem> TabControl()
        {
            ObservableCollection<TabItem> Tabs= new ObservableCollection<TabItem>();

            return Tabs;
        }
  private void AddNewTabItem(string selectedItem)
    {
    try
        {

            System.Windows.Controls.RichTextBox richtextbox = new System.Windows.Controls.RichTextBox();
            richtextbox.Name = "richtextbox" + selectedItem;
            BrushConverter BC = new BrushConverter();
            richtextbox.Background = (SolidColorBrush)(BC.ConvertFrom("#FF098BBB"));
            richtextbox.Foreground = System.Windows.Media.Brushes.WhiteSmoke;
            richtextbox.IsReadOnly = true;

            TabItem m_tabItem = new TabItem();

            m_tabItem.Header = selectedItem;
            m_tabItem.Name = "tab" + selectedItem; 


            if (TabControl.Items.Count == 0)
            {
                TabControl.Items.Insert(0, m_tabItem);
                TabControl.SelectedIndex = msgTracerTabControl.Items.Count - 1;
            }
            else
            {
                TabControl.Items.Insert(msgTracerTabControl.Items.Count - 1, m_tabItem);
                TabControl.SelectedIndex = msgTracerTabControl.Items.Count - 2;
            }




            m_tabItem.Content = new System.Windows.Controls.RichTextBox();
            m_tabItem.Content = richtextbox;
            Tabs.add(m_tabItem);
        }
        catch (Exception EX)
        {

        }

    }
<TabControl  Grid.Column="1" Grid.Row="1" ItemsSource="{Binding TabControl}"  }"/>
    public class MainViewModel : BindableBase
    {
        private int _tabSuffix;
        public ObservableCollection<TextViewModel> TextTabs { get; set; } = new ObservableCollection<TextViewModel>();

    public DelegateCommand AddNewTabCommand { get; set; }

    public MainViewModel()
    {
        AddNewTabCommand = new DelegateCommand(OnAddNewTabCommand);
    }

    private void OnAddNewTabCommand()
    {
        TextTabs.Add(new TextViewModel()
        {
            Header = $"Tab #{_tabSuffix++}"
        });
    }
}
<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Content="Add new tab item" Command="{Binding AddNewTabCommand}"></Button>
        <TabControl Grid.Row="1"
                    ItemsSource="{Binding TextTabs}"
                    IsSynchronizedWithCurrentItem="True">
            <!-- Defines the header -->
            <TabControl.ItemTemplate>
                <DataTemplate DataType="{x:Type so44497239:TextViewModel}">
                    <TextBlock Text="{Binding Header}" />
                </DataTemplate>
            </TabControl.ItemTemplate>

            <!-- defines the context of each tab -->
            <TabControl.ContentTemplate>
                <DataTemplate DataType="{x:Type so44497239:TextViewModel}">
                    <RichTextBox Background="#FF098BBB" Foreground="WhiteSmoke" IsReadOnly="False" />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
public class TextViewModel : BindableBase
    {
        public string Header { get; set; }
        public Brush BackgroundBrush { get; set; }
        public Brush ForegroundBrush { get; set; }

        public string Document { get; set; }
    }