修改一个项目后,更改Expander Header的前景色

时间:2016-03-04 07:35:45

标签: c# wpf expander listcollectionview groupstyle

每个人,

我有一个问题是在修改扩展器的项目后更改扩展器标头的前景颜色。

这是我的WPF片段,我已经拥有:

<GroupStyle>
    <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander Margin="10,0,0,0" IsExpanded="True"
                                  BorderBrush="{Binding ., Converter={StaticResource BackgroundHeader}}">
                            <Expander.Background>
                                <Binding Path="." Converter="{StaticResource BackgroundHeader}" />
                            </Expander.Background>
                            <Expander.Header >
                                <DockPanel Background="{Binding .,Converter={StaticResource BackgroundHeader}}">
                                    <TextBlock FontWeight="Bold" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" 
                                               Foreground="{Binding ., Converter={StaticResource ForegroundHeader}}" 
                                               Margin="5,0,0,0"/>
                                </DockPanel>
                            </Expander.Header>
                            <Expander.Content>
                                <ItemsPresenter />
                            </Expander.Content>
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupStyle.ContainerStyle>
</GroupStyle>

我在更改值后已尝试刷新ListCollectionView,但性能非常糟糕。

MyListCollectionView.Refresh();

感谢您的帮助......

更新 这是GroupStyle中我的WPF片段定义:

<DataGrid x:Name="DataGridItemList" Grid.Row="1" ItemsSource="{Binding Path= CurrentWorkItemList}"
          SelectedItem="{Binding Path= CurrentSelectedItem}" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <.../>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn x:Name="SelectedCol" Header=" " CanUserResize="False">
            <DataGridTemplateColumn.CellTemplate >
                <DataTemplate>
                    <CheckBox x:Name="ckbIsSelected" Click="CkbIsSelected_OnClick" IsChecked="{Binding Path = IsSelected, UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Center"
                              IsEnabled="{Binding Path = Mandatory, Converter={StaticResource InvertBoolean}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn>
            <.../>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
    <DataGrid.GroupStyle>
        <!-- Style for groups at top level. -->
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Margin" Value="0"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander Margin="10,0,0,0" IsExpanded="True"
                                          BorderBrush="{Binding ., Converter={StaticResource BackgroundHeader}}">
                                    <Expander.Background>
                                        <Binding Path="." Converter="{StaticResource BackgroundHeader}" />
                                    </Expander.Background>
                                    <Expander.Header >
                                        <DockPanel Background="{Binding .,Converter={StaticResource BackgroundHeader}}">
                                            <TextBlock FontWeight="Bold" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" 
                                                       Foreground="{Binding ., Converter={StaticResource ForegroundHeader}}" 
                                                       Margin="5,0,0,0"/>
                                        </DockPanel>
                                    </Expander.Header>
                                    <Expander.Content>
                                        <ItemsPresenter />
                                    </Expander.Content>
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="White" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

...以及此视图的ViewModel:

 public class ViewModel : INotifyPropertyChanged
    {
        public ViewModel()
        {
            ...
        }


        #region Properties

        private ListCollectionView _currentWorkItemList;

        public ListCollectionView CurrentWorkItemList
        {
            get { return _currentWorkItemList; }
            set
            {
                _currentWorkItemList = value;
                OnPropertyChanged("CurrentWorkItemList");
            }
        }

        private MyClass _CurrentSelectedItem;

        public MyClass CurrentSelectedItem
        {
            get { return _CurrentSelectedItem; }
            set
            {
                var saved = CheckChangesAndSaveItem(_CurrentSelectedItem);
                _CurrentSelectedItem = value;
                if (_CurrentSelectedItem != null)
                {
                    SetCurrentSelectedItemToCache(_CurrentSelectedItem);
                }
                OnPropertyChanged("CurrentSelectedItem");
            }
        }


        private MyClass _selectedItemCache;

        public MyClass SelectedItemCache
        {
            get { return _selectedItemCache; }
            set
            {
                _selectedItemCache = value;
                OnPropertyChanged("SelectedItemCache");
            }
        }

        #endregion


        #region Public Functions/Commands

        public void InitViewModel()
        {
            using (new WaitCursor())
            {
                CurrentWorkItemList = new ListCollectionView(...);
                if (CurrentWorkItemList.GroupDescriptions != null)
                {
                    CurrentWorkItemList.GroupDescriptions.Add(new PropertyGroupDescription("Group1"));
                    CurrentWorkItemList.GroupDescriptions.Add(new PropertyGroupDescription("Group2"));
                }
            }
        }


        public void CheckSaveAndCloneCurrentItem()
        {
            CheckSaveAndCloneCurrentItem(_CurrentSelectedItem);
        }

        #endregion



        #region Internal Functions



        private void CheckSaveAndCloneCurrentItem(MyClass currentItem)
        {
            var saved = CheckChangesAndSaveItem(currentItem);

            SetCurrentSelectedItemToCache(currentItem);
        }


        private void SetCurrentSelectedItemToCache(MyClass currentItem)
        {
            if (currentItem != null)
            {
                SelectedItemCache = currentItem.Clone();
            }
        }

        private bool CheckChangesAndSaveItem(MyClass currentItem)
        {
            var eItemIsSelected = ViewModels.DataAdapter.GetWorkItem().IsSelected;
            if (currentItem.IsSelected != SelectedItemCache.IsSelected || SelectedItemCache == null ||
                (currentItem.IsSelected != eItemIsSelected))
            {
                currentItem.Group1 = currentItem.Group1.ToString();
                ViewModels.DataAdapter.SaveAllListItem(currentItem);
                return true;
            }
            return false;
        }

        #endregion


        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        #endregion

    }

0 个答案:

没有答案