【问题标题】:Application doesn't start if I inherit MainWindow如果我继承 MainWindow,应用程序不会启动
【发布时间】:2013-06-05 07:43:08
【问题描述】:

我有一个 RootViewModel 类,我想从那里访问一个 UI 元素(在 MainWindow 中实例化)。为此,我以这种方式设置课程:

 class RootViewModel : MainWindow, INotifyPropertyChanged

但应用程序没有启动。它编译并且没有抛出错误,但窗口没有出现。如果我删除了MainWindow,,我将无法访问在MainWindow.xaml 中创建的元素。我该怎么做才能解决这个问题?

编辑:好的,我知道我不应该这样做,它违背了 MVVM。但是有没有办法直接从 MainWindow 修改一些东西?我应该尝试什么来代替这个?

【问题讨论】:

  • 你想达到什么目的?从表面上看,这似乎是对 MVVM 的可怕误解。
  • ViewModel 不应该从 UI 相关的类继承......这没有任何意义
  • 也许是这样,我试图将 DynamicDataDisplay 绘图仪绑定到一些数据,这些数据是使用动态创建的加载程序加载的。但是很难弄清楚如何将“LineGraphs”(持有绘图仪的那种对象)绑定到它。所以我(肯定是错误的)方法是尝试手动设置。
  • 您是替换了MainWindow.xaml.cs 文件,还是只是在另一个文件中扩展了它?
  • @Tieson T. 在另一个文件中扩展它是什么意思?我不明白这一点。谢谢

标签: c# wpf mainwindow


【解决方案1】:

考虑将 RootViewModel 更改为 UserControl。给它一个名为 Element 的 DependencyProperty,类型为 UIElement

将 RootViewModel 添加到 MainWindow 的 XAML 并绑定到您要使用的元素,如下所示;

<RootViewModel Element="{Binding ElementName=SourceElement}"/>

【讨论】:

    【解决方案2】:

    WPF 窗口是对象,因此您始终可以手动实例化它们,如下所示:

    var foo = new FooWindow(); // new Window object
    foo.Show(); // show window as non-blocking "dialog"
    

    如果您这样做,您可以访问窗口的任何 publicprotected 成员 - 包括任何子控件,只要它们的 Accessibility 属性被相应地标记。因此,如果 FooWindow 有一个名为 TextBoxtxtFooName,您可以像这样访问它:

    string name = foo.txtFooName.Text // get string value from textbox
    

    您还可以分配给任何公共/受保护的成员:

    foo.txtFooName.Text = "Fizz Buzz, Inc.";
    

    现在,MainWindow 通常设置为应用程序的 StartupUri(在 App.xaml 中),这使其成为应用程序的入口点,所以我不完全确定您要做什么.

    【讨论】:

      【解决方案3】:

      我能够通过创建一个来实现我想要的

      public ObservableCollection<ChartPlotter> myPlotCollection { get; set; }
      

      然后在那里添加一个 ChartPlotter,并在 XAML 中设置:

       <DockPanel Grid.Column="2">
              <ItemsControl  Width="Auto" 
                         Height="Auto"
                         ItemsSource="{Binding myPlotCollection}">
              </ItemsControl>
      
          </DockPanel>
      

      这样我就可以完全控制 myPlotCollection[0] 中发生的事情。暂时就够了,等我再试试,把它绑定好。

      【讨论】:

      • 不要忘记将您的答案标记为答案。如果您认为将来对某人没有帮助,也可以删除您的问题
      猜你喜欢
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2012-02-08
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多