2009-05-11 2 views
2

В следующем примере я привязываю XAML к статическому объекту через ObjectDataProvider. Когда пользователь меняет информацию, я хочу, чтобы она автоматически отражалась в XAML.Как заставить WPF DataBinding-to-object работать

То, что я не понимаю:

  • как я увековечить объект? мне нужно создать синглтон? в событии click, как мне получить доступ к «редактируемому объекту»
  • В конечном итоге, конечно, я хочу, чтобы данные извлекались из модели, которая читает XML-файл или веб-службу, и Я хочу, конечно, мой ViewModel проверять мою модель каждую секунду или около того, чтобы увидеть, изменились ли данные и отразить это на XAML.

Как я попасть туда отсюда:

XAML:

<Window x:Class="TestBinding99382.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestBinding99382" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <ObjectDataProvider 
      x:Key="DataSourceCustomer" 
      ObjectType="{x:Type local:Customer}" MethodName="GetCustomer"/> 

     <Style x:Key="DataRowStyle" TargetType="StackPanel"> 
      <Setter Property="Orientation" Value="Horizontal"/> 
      <Setter Property="VerticalAlignment" Value="Top"/> 
      <Setter Property="Margin" Value="0 10 0 0"/> 
      <Setter Property="DataContext" 
        Value="{StaticResource DataSourceCustomer}"/> 
      <Setter Property="DockPanel.Dock" Value="Top"/> 
     </Style> 
    </Window.Resources> 

    <DockPanel> 
     <StackPanel DockPanel.Dock="Top" 
        DataContext="{StaticResource DataSourceCustomer}" 
        Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=FirstName}"/> 
      <TextBlock Text=" "/> 
      <TextBlock Text="{Binding Path=LastName}"/> 
      <TextBlock Text=" ("/> 
      <TextBlock Text="{Binding Path=FullName}" FontWeight="Bold"/> 
      <TextBlock Text=")"/> 
     </StackPanel> 

     <StackPanel Style="{StaticResource DataRowStyle}"> 
      <TextBlock Text="First Name:"/> 
      <TextBox Text="{Binding Path=FirstName}" 
         Width="200" Margin="3 0 0 0"/> 
     </StackPanel> 

     <StackPanel Style="{StaticResource DataRowStyle}"> 
      <TextBlock Text="Last Name:"/> 
      <TextBox Text="{Binding Path=LastName}" 
        Width="200" Margin="3 0 0 0"/> 
     </StackPanel> 

     <StackPanel Style="{StaticResource DataRowStyle}"> 
      <Button Content="Save Changes" Click="Button_Click"/> 
     </StackPanel> 

    </DockPanel> 
</Window> 

Код За:

using System.Windows; 
using System.ComponentModel; 
using System; 

namespace TestBinding99382 
{ 
    public partial class Window1 : Window 
    { 
     private Customer _customer; 

     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      //I want to edit the _customer object here 
      //and have it my changes automatically reflect in my XAML 
      //via the INotifyPropertyChanged inheritance. 
     } 
    } 

    public class Customer : INotifyPropertyChanged 
    { 
     private string _firstName; 
     private string _lastName; 

     public string FirstName 
     { 
      get 
      { 
       return _firstName; 
      } 

      set 
      { 
       _firstName = value; 
       this.RaisePropertyChanged("FirstName"); 
       this.RaisePropertyChanged("FullName"); 
      } 
     } 

     public string LastName 
     { 
      get 
      { 
       return _lastName; 
      } 

      set 
      { 
       _lastName = value; 
       this.RaisePropertyChanged("LastName"); 
       this.RaisePropertyChanged("FullName"); 
      } 

     } 

     public string FullName 
     { 
      get 
      { 
       return String.Format("{0} {1}", _firstName, _lastName); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void RaisePropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 


     public static Customer GetCustomer() 
     { 
      return new Customer { FirstName = "Jim", LastName = "Smith" }; 
     } 

    } 
} 

ответ

1

в случае щелчка, как Я обращаюсь к «объект, который редактируется»

Вы можете получить доступ к ресурсу позади кода с помощью метода FindResource, см. Ниже.

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ObjectDataProvider objectDataProvider 
     = FindResource("DataSourceCustomer") as ObjectDataProvider; 
    _customer = objectDataProvider.Data as Customer; 
} 

Для других ваших вопросов:

Что увековечить? Вам не нужно создавать singleton для databind в WPF, если это ваш вопрос.

в конце концов, конечно, я хочу, чтобы данные были получены из модели, которая считывает файл XML или веб-службу, и я хочу, конечно, мой ViewModel, чтобы проверить свою модель каждый второй или так, чтобы увидеть, если данные изменились и отразить это на XAML.

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

+0

Я хочу получить пример работы, в котором данные модели постоянно меняются, и эти изменения представлены в XAML, вот пример, который я хочу получить, когда модель имеет текущую DateTime, которая должна быть отражена в XAML: http://stackoverflow.com/questions/851595/why-is-inotifychanged-not-updating-the-variables-in-xaml –

+0

Мне удалось получить этот пример, работая так, как я хотел использовать метод singleton здесь: http : //stackoverflow.com/questions/852441/fat-models-skinny-viewmodels-and-dumb-views-the-best-mvvm-approach –

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