【发布时间】:2012-02-14 22:00:47
【问题描述】:
我遇到了一个非常简单的 DatePicker 绑定问题。
我有一个 ListBox 绑定到具有 DateTime 属性的对象列表。我的页面有一个编辑部分,用于更改所选项目。这很好用 - 当我在 DatePicker 中更新日期时,ListBox 会显示我更新的日期。
但是,当我随后选择另一个项目时,DatePicker 控件也会错误地更新新项目的日期。
这是我的代码:
C#:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace BindingTest
{
public partial class MainPage
{
public MainPage()
{
InitializeComponent();
var vm = new ViewModel();
DataContext = vm;
}
}
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
List = new ObservableCollection<Item>();
for (var n = 0; n < 10; n++)
List.Add(new Item { Date = DateTime.Now.AddDays(n) });
}
public ObservableCollection<Item> List { get; set; }
private Item _selectedItem;
public Item SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value; OnPropertyChanged("SelectedItem"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public class Item : INotifyPropertyChanged
{
private DateTime _date;
public DateTime Date
{
get { return _date; }
set { _date = value; OnPropertyChanged("Date"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
XAML:
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="BindingTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding List}"
DisplayMemberPath="Date"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
<StackPanel Grid.Column="1" DataContext="{Binding SelectedItem}">
<TextBlock Text="Date:" />
<sdk:DatePicker SelectedDate="{Binding Date, Mode=TwoWay}" />
</StackPanel>
</Grid>
</UserControl>
我该如何解决这个问题?
【问题讨论】: