为什么 ItemsControl 不刷新
Why ItemsControl does not refreshed
我有以下 xaml:
<Window.DataContext>
<local:CalendarViewModel />
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="55*" />
<ColumnDefinition
Width="27*" />
</Grid.ColumnDefinitions>
<local:UserControlCalendar
x:Name="ControlCalendar"
Grid.Column="0">
</local:UserControlCalendar>
<ItemsControl
x:Name="HistoryControl"
Grid.Column="1"
Width="210"
Margin="30,10,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemTemplate="{StaticResource DataTemplate.HistoryItems}"
ItemsPanel="{StaticResource ItemsPanel.Vertical}"
ItemsSource="{Binding ListHistoryItems, Mode=OneWay}">
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="FrameworkElement.Margin" Value="0,10,0,0" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Grid>
当 select UserControlCalendar 中的日期应更改 "HistoryControl" 的内容时。在 ViewModel 属性 ListHistoryItems 已更改,但 UserControl 中的 ItemsControl 未刷新。
这是视图模型:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace CustomCalendar
{
public class CalendarViewModel : INotifyPropertyChanged
{
private ObservableCollection<HistoryItems> _listHistoryItems;
private DateTime _selectedDate;
public CalendarViewModel()
{
}
public DateTime SelectedDate
{
get { return _selectedDate; }
set
{
_selectedDate = value;
if (_selectedDate != null)
{
ListHistoryItems = new ObservableCollection<HistoryItems>(GetHistoryItems(_selectedDate));
}
}
}
public ObservableCollection<HistoryItems> ListHistoryItems
{
get { return _listHistoryItems; }
set
{
_listHistoryItems = value;
RaisePropertyChanged("ListHistoryItems");
}
}
protected virtual void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
问题是 Event 属性Changed 总是空的。
为什么?
预先感谢您的帮助。
如果集合发生变化,ObservableCollection 会自动通知 UI。如果 HistoryModel 属性发生变化,那么您需要调用 Raise属性Changed for that 属性 到 notfyi UI。如果通过 new 关键字创建新的 ObservableCollection,则需要将其刷新为 control.ItemsSource.
还有那些应该显示 historymodel 值的控件,使用绑定路径=propertyname
我发现了我的错误。为了在 MainWindow 中传输 UserControlCalendar 的 SelectedDate,我在 UserControlCalendar 中创建了新的 ViewModel。因此,没有任何效果。现在我删除了那个对象,一切正常。现在还有一个问题,如何传递ViewModel中的SelectedDate。我觉得Prism和EventAggregator的使用。
我有以下 xaml:
<Window.DataContext>
<local:CalendarViewModel />
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="55*" />
<ColumnDefinition
Width="27*" />
</Grid.ColumnDefinitions>
<local:UserControlCalendar
x:Name="ControlCalendar"
Grid.Column="0">
</local:UserControlCalendar>
<ItemsControl
x:Name="HistoryControl"
Grid.Column="1"
Width="210"
Margin="30,10,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemTemplate="{StaticResource DataTemplate.HistoryItems}"
ItemsPanel="{StaticResource ItemsPanel.Vertical}"
ItemsSource="{Binding ListHistoryItems, Mode=OneWay}">
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="FrameworkElement.Margin" Value="0,10,0,0" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Grid>
当 select UserControlCalendar 中的日期应更改 "HistoryControl" 的内容时。在 ViewModel 属性 ListHistoryItems 已更改,但 UserControl 中的 ItemsControl 未刷新。 这是视图模型:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace CustomCalendar
{
public class CalendarViewModel : INotifyPropertyChanged
{
private ObservableCollection<HistoryItems> _listHistoryItems;
private DateTime _selectedDate;
public CalendarViewModel()
{
}
public DateTime SelectedDate
{
get { return _selectedDate; }
set
{
_selectedDate = value;
if (_selectedDate != null)
{
ListHistoryItems = new ObservableCollection<HistoryItems>(GetHistoryItems(_selectedDate));
}
}
}
public ObservableCollection<HistoryItems> ListHistoryItems
{
get { return _listHistoryItems; }
set
{
_listHistoryItems = value;
RaisePropertyChanged("ListHistoryItems");
}
}
protected virtual void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
问题是 Event 属性Changed 总是空的。 为什么? 预先感谢您的帮助。
如果集合发生变化,ObservableCollection 会自动通知 UI。如果 HistoryModel 属性发生变化,那么您需要调用 Raise属性Changed for that 属性 到 notfyi UI。如果通过 new 关键字创建新的 ObservableCollection,则需要将其刷新为 control.ItemsSource.
还有那些应该显示 historymodel 值的控件,使用绑定路径=propertyname
我发现了我的错误。为了在 MainWindow 中传输 UserControlCalendar 的 SelectedDate,我在 UserControlCalendar 中创建了新的 ViewModel。因此,没有任何效果。现在我删除了那个对象,一切正常。现在还有一个问题,如何传递ViewModel中的SelectedDate。我觉得Prism和EventAggregator的使用。