gpt4 book ai didi

c# - 我可以在 1 个应用程序中拥有同一个 UserControl 的多个实例吗?

转载 作者:行者123 更新时间:2023-11-30 15:46:52 25 4
gpt4 key购买 nike

我正在创建一个文本编辑器类型的应用程序。我可以通过选项卡打开多个编辑器。在我的第一次尝试中,我使用了简单的 TextBox es 编辑文本。一切正常。然后我创建了一个 UserControl封装文本框+按钮以执行文本操作,例如。粗体/斜体等。我发现当我打开不同的标签时,它们都包含相同的内容。例如。在 Tab1 中,我输入将出现在所有选项卡中的“hello world”。即使它们在不同的选项卡中,也没有“分离”

<Window.Resources>
<DataTemplate DataType="{x:Type vm:EditorTabViewModel}">
<me:MarkdownEditor />
</DataTemplate>
</Window.Resources>

然后我作为测试,一起尝试了一个文本框和用户控件,看看我是否有同样的问题。

<Window.Resources>
<DataTemplate DataType="{x:Type vm:EditorTabViewModel}">
<StackPanel>
<me:MarkdownEditor Text="{Binding Content}" Height="360" />
<TextBox Text="{Binding Content}" Height="360" />
</StackPanel>
</DataTemplate>
</Window.Resources>

然后我发现了一些奇怪的事情。使用新文档,内容应该是空的,我的 MarkdownEditor在它的文本框中有“System.Windows.Controls.Grid”,因为它是一个网格绑定(bind)到文本。简单文字TextBox按预期工作。我对所有 UserControl 仍然有同样的问题。 s 在具有相同内容的应用程序中。

UserControl 的 XAML

<UserControl x:Class="MarkdownEditMVVM.Controls.MarkdownEditor.MarkdownEditor" ...>
<Grid>
<ToolBar Grid.Row="0">
<Button Command="{x:Static local:Commands.PreviewCommand}">
<Image Source="../../Images/16/zoom.png" />
</Button>
<!-- more buttons -->
</ToolBar>
<TextBox Grid.Row="1" x:Name="txtEditor" AcceptsReturn="True" Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</UserControl>


更新

我发现这与我在选项卡绑定(bind)到 ObservableCollection<TabViewModel> 的选项卡中呈现用户控件的方式有关。

假设我有一个 TabViewModel 即使只是一个空类

public class TabViewModel {}

然后在我的窗口

public partial class Window1 : Window
{
protected ObservableCollection<TabViewModel> _tabs;
protected ICollectionView _tabsCollectionView;

public Window1()
{
InitializeComponent();
this.DataContext = this;
_tabs = new ObservableCollection<TabViewModel>();
_tabs.Add(new TabViewModel());
_tabs.Add(new TabViewModel());
_tabsCollectionView = CollectionViewSource.GetDefaultView(_tabs);
}

public ICollectionView Tabs
{
get { return _tabsCollectionView; }
}
}

XAML

<TabControl ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>

我创建了一个简单的 Visual Studio 项目托管在@ mediafire说明这个问题。我觉得它与 TabViewModel 有关s 或选项卡数据模板


更新2

我通过添加另一个选项卡控件进一步测试了用户控件问题,这次没有 TabViewModel

<TabControl Grid.Column="1">
<TabItem Header="Tab 1">
<TextBox />
</TabItem>
<TabItem Header="Tab 2">
<TextBox />
</TabItem>
</TabControl>

一切正常。更新也发布到 mediafire


更新 3

还有一个发现。这次,我测试了绑定(bind)。一切正常......

<TabControl Grid.Column="2" ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Text}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>

更新也发布在@mediafire


更新 4

好的,现在我做了一组更完整的测试

alt text

  • 第 0 行,第 0 列:TextBox , 标签绑定(bind)到 ObservableCollection<TabViewModel> . TextBox 没有绑定(bind).观察到的问题
  • 第 0 行,第 1 列:文本框、普通选项卡项、未绑定(bind)到 ObservableCollection<TabViewModel> 的选项卡.没有绑定(bind) TextBox .没问题
  • 第 0 行第 2 列:文本框,标签绑定(bind)到 ObservableCollection<TabViewModel> . TextBox 没有绑定(bind).没问题
  • 第 1 行,第 0 列:UserControl , 标签绑定(bind)到 ObservableCollection<TabViewModel> . UserControl 没有绑定(bind).观察到的问题
  • 第 1 行第 2 列:UserControl , 标签绑定(bind)到 ObservableCollection<TabViewModel> . UserControl 的绑定(bind).观察到的问题。文本绑定(bind)不起作用

更新@ mediafire

最佳答案

大编辑响应更新

我可以通过执行以下步骤让您的 mediafire 示例正常工作:

  1. 从您的用户控件中删除依赖属性 Text - 您不需要它
  2. TabControl 上的 ContentTemplate 更改为以下内容。这会导致将 UserControl.DataContext 属性设置为选项卡项 DataContext

     <DataTemplate>
    <local:UserControl1 />
    </DataTemplate>
  3. 将您的 UserControl 更改为以下内容。这会将 Text 属性绑定(bind)到 UserControl.DataContext.Text 属性。

    <TextBox Text="{Binding Text}" />
  4. UserControl1 的构造函数中删除行 this.DataContext = this - 这显然会为用户替换 DataContext控制。

这导致选项卡与您上传的示例应用中的预期值正确绑定(bind)


原始答案

您可以拥有多个 UserControl 实例 - 这不是您的问题。

您看到“System.Windows.Controls.Grid”文本的原因是因为在您的 UserControl 中,您将 Text 属性绑定(bind)到 this。 DataContext.Text 而不是 this.Text - 您的 UserControl 属性。

我认为您想要做的是将用户控件中的 TextBox 绑定(bind)更改为:

<TextBox Grid.Row="1" x:Name="txtEditor" AcceptsReturn="True"
Text="{Binding Path=Text,
UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type me:MarkDownEditor}}}" />

注意:这依赖于 me 命名空间被设置为指向您的 MarkDownEditor 所在的位置

关于c# - 我可以在 1 个应用程序中拥有同一个 UserControl 的多个实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com