0

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

 class RootViewModel : MainWindow, INotifyPropertyChanged

但是应用程序没有启动。它编译并且没有抛出错误,但窗口没有出现。如果我删除它,MainWindow,我将无法访问在MainWindow.xaml. 我能做些什么来解决这个问题?

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

4

3 回答 3

0

我能够通过创建一个

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

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

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

    </DockPanel>

所以这样我就可以完全控制 myPlotCollection[0] 中发生的事情。此刻对我来说已经足够了,以后我会再尝试正确绑定它。

于 2013-06-05T08:34:58.407 回答
0

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

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

<RootViewModel Element="{Binding ElementName=SourceElement}"/>
于 2013-06-05T07:58:43.763 回答
0

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

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

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

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

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

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

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

于 2013-06-05T08:18:01.990 回答