2015-05-12 2 views
0

Возможно, это всего лишь небольшой шаг к решению, но я пока не могу его получить.MVVM Распространение объектов

Я сделал несколько учебников по WPF для DataContext и Binding, но я не могу понять, как я мог бы использовать контекст и/или привязку между (двумя) страницами.

Например, когда вы смотрите на это: https://msdn.microsoft.com/en-us/library/ms754356%28v=vs.110%29.aspx

<Label>Enter a Name:</Label> 
<TextBox> 
    <TextBox.Text> 
     <Binding Source="{StaticResource myDataSource}" Path="Name" UpdateSourceTrigger="PropertyChanged"/> 
    </TextBox.Text> 
</TextBox> 

<Label>The name you entered:</Label> 
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/> 

Это будет результат:

enter image description here

Это простой пример, и нет никаких проблем работает и понимание этого, но я хочу:

  1. Заполните TextBox и Label от кода позади. Я пытался назвать TextBoxtb, а затем просто позвонить tb.Text = "some text" - он работает. Я также попытался присвоить DataContext как для TextBox, так и для Label, а затем создать объект и заполнить DataContext с объектом - это тоже сработало.
  2. Размещение Label на другой странице.

Задача 2 является тот, который действительно трудно для меня, особенно в сочетании с проблемой 1. Например: Когда я создаю объект в страницу 1 конструктора и назначить ему DataContext (Ofcourse) только TextBox на страница 1 будет содержать значение.

Я просто не знаю, как поделиться этим одним объектом. Я объявил на странице 1 со страницей 2, чтобы установить его также на DataContext.

Возможно, я просто не нашел для себя идеального учебника или объяснения, чтобы понять, как DataContext и Binding действительно работает и как я могу обмениваться объектами между страницами и окнами.

Можете ли вы, ребята, помочь мне?

Если вам нужно больше информации, не стесняйтесь спрашивать;)

+0

Есть ли у страницы 2 свой ViewModel? –

+0

@DavidBeaumont Да, но только потому, что я не знаю, как разделить одну и ту же ViewModel между этими двумя страницами. – Sonnywhite

+0

Я тоже новичок в MVVM, но я считаю, что лучшей практикой является наличие собственной ViewModel для представления. Я передал через оба ViewModels с помощью инструментария MVVM Lights, выполнив уведомление. –

ответ

0
public class MySharedDataContext : INotifyPropertyChanged 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (value == _name) return; 
      _name = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

В App.xaml создают общий ресурс:

<Application x:Class="WpfApplication1.App" 
      xmlns:my="clr-namespace:WpfApplication1"> 
    <Application.Resources> 

     <my:MySharedDataContext x:Key="MySharedDataContext" /> 

теперь вы можете использовать общий ресурс в обеих страницах:

<TextBox Text="{Binding Name, Source={StaticResource MySharedDataContext}" /> 

если вы хотите отправить значение имени, лучше не обращаться к TextBox напрямую, а установить его в вас. MySharedDataC ontext класс:

var dataContext = (MySharedDataContext)FindResource("MySharedDataContext"); 
dataContext.Name = "John Smith"; 
+0

спасибо за это !! Это 100%, что я искал. Интересно, почему это не объясняется во многих учебниках. Они предполагают, что вы используете только одно окно. Часть с разделяемыми ресурсами была, наконец, той, которую я пропустил;) – Sonnywhite

+0

Я не знаю, почему она не работает. Создайте новый вопрос и укажите более подробную информацию. Однако я бы определил массив как свойство класса MySharedDataContext, вместо того, чтобы создавать массив в ресурсах. – Liero

+0

его работа ... ключевое слово здесь было «ObservableCollection';) – Sonnywhite

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