Как заставить WPF DataBinding-to-a-object работать - PullRequest
2 голосов
/ 11 мая 2009

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

Что я не понимаю, так это:

  • как мне увековечить объект? я должен создать синглтон? в событии 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 Ответ

1 голос
/ 11 мая 2009

в событии click, как получить доступ «редактируемый объект»

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

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

По другим вопросам:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...