如何将代码隐藏中的自定义对象绑定到XAML中的Grid?

时间:2009-10-15 14:29:18

标签: c# wpf data-binding xaml

在以下示例中,Message属性绑定正确,但Customer对象的FirstName,LastName和Age属性为空。那是为什么?

XAML:

<Window x:Class="TestBinding9922.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}"/>

        <Grid DataContext="{Binding Customer}" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <Label Grid.Column="0" Grid.Row="0" Content="First Name:" />
            <Label Grid.Column="0" Grid.Row="1" Content="Last Name:" />
            <Label Grid.Column="0" Grid.Row="2" Content="Age:" />

            <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" />
            <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" />
            <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Age}" />

        </Grid>

    </StackPanel>
</Window>

代码隐藏:

using System.Windows;
using System.ComponentModel;

namespace TestBinding9922
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        public string Message { get; set; }
        public Customer Customer { get; set; }

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Message = "this works";

            Customer customer = new Customer() { FirstName = "Jim", LastName = "Smith", Age = 45 };
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
}

附录:

即使我使用INotifyPropertyChanged,文本框仍为空白:

using System.Windows;
using System.ComponentModel;

namespace TestBinding9922
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion

        #region ViewModelProperty: Customer
        private Customer _customer;
        public Customer Customer
        {
            get
            {
                return _customer;
            }

            set
            {
                _customer = value;
                OnPropertyChanged("Customer");
            }
        }
        #endregion

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Message = "this works";

            Customer customer = new Customer() { FirstName = "Jim", LastName = "Smith", Age = 45 };
        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }

}

3 个答案:

答案 0 :(得分:3)

您的Customer类需要实现INotifyPropertyChanged,随后更改的属性需要在更改时通知。

您可以在其他地方找到此here的示例。

另外,您没有实例化您的Customer属性,而是创建了一个局部变量;它应该是:

Customer = new Customer() 
    { FirstName = "Jim", LastName = "Smith", Age = 45 };

答案 1 :(得分:2)

您似乎将新的Customer实例分配给本地变量“customer”,而不是分配给Window的属性。

答案 2 :(得分:0)

您可以在XAML中删除网格的DataContext设置,然后将文本框绑定到Customer.FirstName等。

或者,您可以像以前一样删除XAML中网格的DataContext设置,但是为网格指定一个名称,然后在代码隐藏中设置其DataContext,就像您为窗口所做的那样。