WPF ListView 实现根据 ItemSource 中对象的属性设置控件 Foreground或者BackgroundColor

xaml:

   <ListView Grid.Row="0" Grid.Column="2" Grid.RowSpan="3" x:Name="listBoxIds" SelectionMode="Single">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Variety}">
                                <TextBlock.Foreground>
                                    <SolidColorBrush Color="{Binding ForegroundColor}"/>
                                </TextBlock.Foreground>
                            </TextBlock>
                        </DataTemplate>
                    </ListView.ItemTemplate>
    </ListView>

data:

    public class VarietyEx
        : INotifyPropertyChanged
    {
        public VarietyEx(Variety arg_v)
        {
            Variety = arg_v;
            Selected = true;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public Variety Variety { get; }        
        public bool Selected
        {
            get
            {
                return _selected;
            }
            set
            {               
                _selected = value;                           
                _NotifyPropertyChanged($"{nameof(ForegroundColor)}");
            }
        }
        public Color ForegroundColor => Selected ? Colors.Black : Colors.Gray;

        public override string ToString()
        {
            return Variety.ToString();
        }


        void _NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));            
        }

        bool _selected;
    }

code

 //declare: 
 ObervableCollection<VarietyEx> _vtVarietyEx = new ObservableCollection<VarietyEx>();
 //Usage:
 listBoxIds.ItemsSource = _vtVarietyEx;

其实主要Point就是在ListView的xaml中加入 Listview.ITemTemplate/DataTemplate/TextBlock/…..
主要xaml中的Binding xxxx 其中 xxxx对应这PropertyName,千万不要写错,vs没有提示,直接会显示空白……
另外要动态触发时只需要NotifyPropertyChanged(PropertyName)
在我的工程中实际是当data.Selected 发生变化时,我会在后台调用 _NotifyPropertyChanged(“ForegroundColor”) 使得wpf动态绘画

参考:
https://stackoverflow.com/questions/20806528/change-listviewitem-text-color
https://www.codeproject.com/Questions/705686/Change-the-forecolor-of-a-ListViewItem-in-WPF

posted on 2024-08-02 14:05  norsd  阅读(4)  评论(0编辑  收藏  举报  来源

导航