【问题标题】:ItemsControl does not update when ObservableCollection changes当 ObservableCollection 更改时 ItemsControl 不更新
【发布时间】:2021-11-26 17:11:24
【问题描述】:

我正在创建一个日历并且我正在使用 MVVM 灯。当我更改可观察集合时,UI 不会更新。 我的目标是,如果我单击 ItemsControl 中的按钮,可观察的 Collection 会发生变化,并且应该在我的按钮样式中触发 DataTriger。

主窗口中的东西:

private ObservableCollection<Dates> _list;
public ObservableCollection<Dates> List
        {
            get { return _list; }
            set
            {
                _list = value;
                RaisePropertyChanged(nameof(List));
            }
        }

public RelayCommand<DateTime> DayClickedCommand { get; private set; }
private void DayClickedeCommandParameterhandling(DateTime s)
        {
            for (int i = 0; i < List.Count; i++)
            {
                if (List[i].Date == s)
                {
                    List[i].IsSelected = true;
                }
            }
        }

日期类:

public class Dates
    {
        public Dates(DateTime day, int currentMonth)
        {
            Date = day;
            Day = day.Day.ToString();
            if ((int)day.Month == currentMonth)
            {
                IsInactive = false;
            }
            else
            {
                IsInactive = true;
            }
            if (day.DayOfYear == DateTime.Today.DayOfYear)
            {
                IsToday = true;
            }
            else IsToday = false;
        }

        #region Properties
        public DateTime Date { get; set; }
        public string Day { get; set; }
        public bool IsInactive { get; set; }
        public bool IsToday { get; set; }
        public bool IsSelected { get; set; }


        #endregion Properties
    }

我的 Xaml:

 <ItemsControl ItemsSource="{Binding List}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel></WrapPanel>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate >
                                <Grid Height="{Binding ElementName=Monday, Path=ActualHeight}" Width="{Binding ElementName=Monday, Path=ActualWidth}" Name="grid">
                                    <Button  Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.DayClickedCommand}" CommandParameter="{Binding Date}"  VerticalContentAlignment="Center" HorizontalContentAlignment="Center" MinHeight="10" MinWidth="10" FontSize="{Binding ElementName=textblockMonday, Path=FontSize}" Name="Button" BorderThickness="3" Content="{Binding Day}" >
                                            <Button.Style>
                                            <Style TargetType="Button">
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding IsInactive}" Value="True">
                                                        <Setter Property="Foreground" Value="Green" />
                                                        <Setter Property="Background" Value="Transparent" />
                                                    </DataTrigger> 
                                                    <DataTrigger Binding="{Binding IsInactive}" Value="false">
                                                        <Setter Property="Background" Value="Transparent" />
                                                    </DataTrigger>
                                                    <DataTrigger Binding="{Binding IsToday}" Value="true">
                                                        <Setter Property="Background" Value="Yellow" />
                                                        <Setter Property="Foreground" Value="Orange" />
                                                        <Setter Property="BorderBrush" Value="Orange" />
                                                    </DataTrigger> 
                                                    <DataTrigger Binding="{Binding IsToday}" Value="false">
                                                        <Setter Property="BorderBrush" Value="Transparent" />
                                                    </DataTrigger>
                                                    <DataTrigger Binding="{Binding IsSelected}" Value="true">
                                                        <Setter Property="Background" Value="Green" />
                                                        <Setter Property="Foreground" Value="Purple" />
                                                        <Setter Property="BorderBrush" Value="Orange" />
                                                    </DataTrigger>
                                                </Style.Triggers>
                                                </Style>
                                        </Button.Style>
                                    </Button>
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

命令运行,集合改变,但不通知ui。

【问题讨论】:

    标签: c# wpf binding mvvm-light observablecollection


    【解决方案1】:

    您的Dates 类应该实现INotifyPropertyChanged 并为IsSelected 属性引发PropertyChanged 事件:

    public class Dates : INotifyPropertyChanged
    {
        public Dates(DateTime day, int currentMonth)
        {
            Date = day;
            Day = day.Day.ToString();
            if ((int)day.Month == currentMonth)
            {
                IsInactive = false;
            }
            else
            {
                IsInactive = true;
            }
            if (day.DayOfYear == DateTime.Today.DayOfYear)
            {
                IsToday = true;
            }
            else IsToday = false;
        }
    
        #region Properties
        public DateTime Date { get; set; }
        public string Day { get; set; }
        public bool IsInactive { get; set; }
        public bool IsToday { get; set; }
    
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set { _isSelected = value; NotifyPropertyChanged(); }
        }
        #endregion Properties
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName]
            string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    ObservableCollection&lt;T&gt; 中的 T 项目被修改时不会发出更改通知。仅当您向其中添加或删除项目时,它会引发一个事件。

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多