RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1120131
Accepted
AlanAugust
AlanAugust
Asked:2020-05-04 21:13:30 +0000 UTC2020-05-04 21:13:30 +0000 UTC 2020-05-04 21:13:30 +0000 UTC

访问 MainWindow 类之外的 XAML 元素

  • 772

我正在使用 MVVM。有一个 XAML 元素具有自己的Name="nameElement". 我只能从 MainWindow 类访问它,但我不想在这个类中编写额外的代码。

例如:有一个 ListBox 与Name="kernelList"

看法:

<ListBox x:Name="kernelsList" SelectionChanged="kernelsList_SelectionChanged" Margin="160,0,41,10">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="5" Orientation="Horizontal">
                    <TextBlock Margin="5" FontSize="16" Text="{Binding Name}" HorizontalAlignment="Center" />
                    <CheckBox Margin="5" FontSize="16" IsChecked="{Binding IsVisualization}" HorizontalAlignment="Center" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我只能访问MainWindow 类中的“kernelList” 。假设我想向列表中添加一个项目

kernelsList.ItemsSource = Kernels;

如何从其他类访问 XAML 元素?

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Developer
    2020-05-04T22:15:40Z2020-05-04T22:15:40Z

    ((MainWindow)System.Windows.Application.Current.MainWindow).+ 所需元素。

    一般来说,以适合您的方式编写代码。并非所有东西都可以通过绑定来实现,它们并不总是有效。主要是工作代码,不漂亮或不正确。

    • 2
  2. EvgeniyZ
    2020-05-04T22:54:57Z2020-05-04T22:54:57Z

    您目前正遭受许多 MVVM 违规。

    1. 根据 MVVM 的规则,你不应该知道你的 View 层有什么,就像 View 层不应该知道任何关于实现的事情一样。通过名称寻址,您违反了此规则,因为您与对象有严格的联系。删除 XAML 并运行项目,如果您正确实现了 MVVM,那么它将运行,代码将工作。

    2. 据我了解,您没有设置为的基类,DataContext因此您不了解如何进行。创建一个类,例如命名它MainViewModel并在那里创建另一个 ViewModel 的属性,现在你有一个连接。

    基于这一切,让我们做一个简单的项目来实现正确的 MVVM 方法:

    1. 为方便起见,我们创建了一个目录ViewModels,并在其中创建了主类,我们将默认调用它MainViewModel。

    2. 将DataContect窗口设置为我们创建的类。让我们做对:

      • 我们进入App.xaml并删除那里的行StartupUri="MainWindow.xaml"。
      • 接下来,我们通过将其设置为 来App.xaml.cs覆盖Startup我们创建窗口对象的DataContext。

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            new MainWindow { DataContext = new MainViewModel() }.Show();
        }
        
    3. 在这个阶段,我们有一个窗口,它有一个MainViewModel类形式的数据源,它将很高兴地从中获取所有绑定。让我们在那里创建一个属性并检查一下:

      • 让我们用标准文本写入一个MainViewModel简单的属性(请记住,绑定仅适用于公共属性!)

        public string Text { get; set; } = "Тестовое значение";
        
      • 在窗口的 XAML 中,我们创建一个TextBlock,它将从此值中获取文本:

        <TextBlock
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            FontSize="30"
            Text="{Binding Text}" />
        

      结果

      结果1

    如您所见,一切都已成功附加,并且 View 层对 ViewModel 层一无所知。

    1. 现在让我们创建另一个 ViewModel,它可以访问主视图,拥有自己的绑定属性,并将更改我们在上面附加的文本的值。

      • 我们开设了一个新班级,我们取任何你喜欢的名字。我会打电话SecondViewModel的。请记住,我们为此有一个特殊的文件夹,我们应该在其中创建它吗?

      • C#中传值是DI(有兴趣可以google一下是什么),主要的两种传递方式是通过构造函数或者通过属性。如果一个对象依赖于另一个对象,那么最好通过构造函数传递这种依赖关系。我们的虚拟机将依赖于主虚拟机,所以让我们通过构造函数进行传输:

        class SecondViewModel
        {
            private MainViewModel mainViewModel;
        
            public SecondViewModel(MainViewModel mainViewModel)
                => this.mainViewModel = mainViewModel;
        }
        

      现在,如果没有 ,就无法创建此类MainViewModel,并且通过私有字段(可以将其设为公共属性以进行绑定),我们可以访问所有给定的MainViewModel对象。

      • 现在让我们制作一个锚测试字段并绑定它:

        • 物业本身在SecondViewModel:

          public string TestValue { get; set; } = "Значение из SecondViewModel";
          
        • SecondViewModel在主 VM 中初始化。在类构造函数中初始化的简单公共属性:

          public MainViewModel()
          {
              SecondViewModel = new SecondViewModel(this);
          }
          
          public SecondViewModel SecondViewModel { get; }
          
        • 好吧,在 XAML 中,我们只在需要的地方使用它:

          <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
              <TextBlock FontSize="30" Text="{Binding Text}" />
              <TextBlock FontSize="20" Text="{Binding SecondViewModel.TestValue}" />
          </StackPanel>
          

    显示来自不同 VM 的属性的结果:

    结果2

    剩下的最后一件事是将主虚拟机从SecondViewModel. 在这里,我想你已经猜到了,我们已经有了一个链接,并且可以通过它轻松访问所需的属性,例如,我们通过构造函数来做:

        public SecondViewModel(MainViewModel mainViewModel)
        {
            this.mainViewModel = mainViewModel;
            this.mainViewModel.Text = "Измененное значение из SecondVM";
        }
    

    最后我们得到改变的值:

    结果3

    这里有一个陷阱 - 如果您的属性在应用程序运行时发生更改,则必须通过 通知INotifyPropertyChanged接口,否则接口将具有旧值!

    • 2
  3. GromWolf
    2020-05-04T22:13:23Z2020-05-04T22:13:23Z

    在 Form1 中,创建一个新窗口并将指向所需对象的链接传递到其中

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window1 w1 = new Window1();
            w1.LB = this.kernelsList; // передаем ссылку на ListBox в форму Form2
            w1.Show();
        }
    

    在 Form2 中,我们声明一个分配了链接的对象并对其进行更改,从而更改所需的元素

        public ListBox LB;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            LB.Items.Add("SomeThink"); //можете проводить любые манипуляции теперь
        }
    

    PS,您已经从另一个类访问了 XAML 元素。问候和祝你好运。

    • 0

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5