2013-06-05 2 views
0

У меня есть класс RootViewModel, и я хочу получить доступ к элементу пользовательского интерфейса (скомпилирован в MainWindow). Для этого я установил класс следующим образом:Приложение не запускается, если я наследую MainWindow

class RootViewModel : MainWindow, INotifyPropertyChanged 

Но приложение не запускается. Он компилирует и не вызывает ошибок, но окно не появляется. Если я удалю это MainWindow,, я не могу получить доступ к элементу, который был создан в MainWindow.xaml. Что я могу сделать, чтобы решить эту проблему?

EDIT: Хорошо, я понимаю, что я не должен этого делать, это противоречит тому, что это MVVM. Но есть ли способ напрямую изменить что-то из MainWindow? Что я должен попробовать вместо этого?

+5

Что вы пытаетесь достичь? Это кажется на первый взгляд, как ужасная неверная интерпретация MVVM. – Gusdor

+0

ViewModel не должен наследовать от класса, связанного с UI ... он не имеет никакого смысла –

+0

Возможно, это так, я пытался привязать плоттер DynamicDataDisplay к некоторым данным, загружаемым динамически созданным загрузчиком. Но трудно понять, как привязать к нему «LineGraphs» (тип объектов, который держит плоттер). Поэтому мой (конечно, неправильный) подход - попытаться установить его вручную. – Sturm

ответ

0

Рассмотрите возможность изменения RootViewModel на UserControl. Дайте ему DependencyProperty Элемент, тип UIElement.

Добавить RootViewModel в XAML для MainWindow и привязать элемент, который вы хотите использовать, например:

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

WPF окна являются объектами, так что вы всегда можете создать экземпляр их вручную, например, так:

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

Если вы сделаете это, у вас есть доступ к любым public или protected членов окна - что включает в себя любые дочерние элементы управления, если их свойства Accessibility отмечены соответствующим образом. Таким образом, если FooWindow был TextBox по имени txtFooName, вы можете получить доступ к нему так:

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

Вы также можете назначить какие/защищенные член:

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

Теперь MainWindow обычно устанавливаются как StartupUri приложения (в App.xaml), что делает его точкой входа для приложения, поэтому я не совсем уверен, что вы пытаетесь сделать.

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]. На данный момент этого достаточно для меня, позже я дам ему еще одну попытку связать его должным образом. Спасибо за ответы, и извините, это может быть немного немой вопрос.

+0

не забудьте указать свой ответ в качестве ответа. вы также можете удалить свой вопрос, если считаете, что это не поможет кому-то в будущем. – WiiMaxx

+0

Я не знаю, есть ли у меня такой же неуклюжий, как я, но на всякий случай я его сохраню. Я не могу отметить это как ответ прямо сейчас (ограничение SO). – Sturm

Смежные вопросы