DataGrid单元格更改后,ObservableCollection不会更新

时间:2017-12-29 09:09:55

标签: c# wpf mvvm data-binding

我是wpfmvvm databinding的新用户。现在我正在尝试使用数据网格进行crud处理。我有一个更新进程的问题。我希望在mvvm进程更新数据网格单元后得到更新值。

模型

public class EmployeeType : INotifyPropertyChanged
    {
        string _EmpType;
        public string EmpType
        {
            get
            {
                return _EmpType;
            }
            set
            {
                if(_EmpType !=value)
                {
                    _EmpType = value;
                    RaisePropertyChange("EmpType");
                }
            }
        }

        string _EmpTypeDesc;
        public string EmpTypeDesc
        {
            get
            {
                return _EmpTypeDesc;
            }
            set
            {
                if(_EmpTypeDesc!=value)
                {
                    _EmpTypeDesc = value;
                    RaisePropertyChange("EmpTypeDesc");
                }
            }
        }

        bool _OTRounding;
        public bool OTRounding
        {
            get
            {
                return _OTRounding;
            }
            set
            {
                if(_OTRounding!=value)
                {
                    _OTRounding = value;
                    RaisePropertyChange("OTRounding");
                }
            }
        }

        decimal _EarlyOTTimeBuffer;
        public decimal EarlyOTTimeBuffer
        {
            get
            {
                return _EarlyOTTimeBuffer;
            }
            set
            {
                if(_EarlyOTTimeBuffer!=value)
                {
                    _EarlyOTTimeBuffer = value;
                    RaisePropertyChange("EarlyOTTimeBuffer");
                }
            }
        }

        string _EarlyOTRounding;
        public string EarlyOTRounding
        {
            get
            {
                return _EarlyOTRounding;
            }
            set
            {
                if(_EarlyOTRounding!=value)
                {
                    _EarlyOTRounding = value;
                    RaisePropertyChange("EarlyOTRounding");
                }
            }
        }  

        public event PropertyChangedEventHandler PropertyChanged;
        void RaisePropertyChange(string prop)
        {
            if(PropertyChanged !=null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }

查看模型

class EmployeeTypeViewModel:ViewModelBase
    {
        private ObservableCollection<EmployeeType> _EmployeeTypeList = new ObservableCollection<EmployeeType>();       
        private ObservableCollection<TimeFormat> _ThreeTimeFormat = new ObservableCollection<TimeFormat>();

        public ObservableCollection<TimeFormat> ThreeTimeFormat
        {
            get
            {
                return _ThreeTimeFormat;
            }
            set
            {
                _ThreeTimeFormat = value;
                RaisePropertyChanged("ThreeTimeFormat");
            }
        }
        public ObservableCollection<EmployeeType> EmployeeTypeList
        {
            get
            {
                return _EmployeeTypeList;
            }
            set
            {
                _EmployeeTypeList = value;
                RaisePropertyChanged("EmployeeTypeList");
            }
        }        

        public EmployeeType _SelectedEarlyOTRounding;
        public EmployeeType SelectedEarlyOTRounding
        {
            get
            {
                return _SelectedEarlyOTRounding;
            }
            set
           {
                if (_SelectedEarlyOTRounding != value)
                {
                    _SelectedEarlyOTRounding = value;
                    RaisePropertyChanged("SelectedEarlyOTRounding");

                }
            }
        }


        public EmployeeTypeViewModel()
        {
            _EmployeeTypeList = DataAccess.EmployeeTypeDataAccessor.GetAllEmployeeTypes();           
            ThreeTimeFormat = TMSHelper.GetThreeTimeFormat();
        }
    }

查看

 <UserControl.Resources>
        <ViewModels:EmployeeTypeViewModel x:Key="ViewModel"/>
    </UserControl.Resources>
    <Grid DataContext="{Binding Source={StaticResource ViewModel}}">
        <DataGrid Margin="10,10,9.6,10.2" x:Name="empgrid" ItemsSource="{Binding EmployeeTypeList,Mode=TwoWay}" AutoGenerateColumns="False"  >
            <DataGrid.Columns>
                <DataGridTextColumn Header="EmpType" Binding="{Binding EmpType,Mode=TwoWay}"/>
                <DataGridCheckBoxColumn Header="OTRounding" Binding="{Binding OTRounding}"/>
                <DataGridTextColumn Header="Description" Binding="{Binding EmpTypeDesc}"/>               
                <DataGridTextColumn Header="Early OT Time Buffer" Binding="{Binding EarlyOTTimeBuffer}"/>
                <DataGridTemplateColumn Header="Early OT Time Rounding">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox SelectedValuePath="Value" DisplayMemberPath="Key" ItemsSource="{Binding Path=DataContext.ThreeTimeFormat,ElementName=empgrid}" SelectedValue="{Binding EarlyOTRounding,Mode=TwoWay}" SelectedItem="{Binding SelectedEarlyOTRounding}"  />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                </DataGridTemplateColumn>
            </DataGrid.Columns>

        </DataGrid>
    </Grid>

我刚才意识到,如果我在datagrid单元格中更改了值,它会自动更新viewmodel中的EmployeeTypeList。因为我在mode=twoway网格中添加了itemsource。对?但是当我调试时,套件EmployeeTypeList永远不会发生。为什么?如果我的做法有误,请让我知道怎么做?如果你不明白,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:0)

你可能只是不明白在这一点上完全绑定并且没关系。

Mode=TwoWay表示当在基础对象中更改值时,以及当用户更改UI上的值时,将在UI上更改绑定属性。

在您的情况下,您必须在UI上替换集合以注意更改。所以,到目前为止,您正在更改ObservableCollection的内容,因此您没有收到有关收集级别的任何通知。当您在UI上更改EmpType时,您应该收到val fileContents: RDD[String] = sparkContext.textfile(pathToFile) val combinedContents: String = fileContents.reduce((line1, line2) => line1 + line2) 的通知。

是否清楚?

答案 1 :(得分:0)

  

BindingMode值之一。默认值为Default,返回   目标依赖项属性的默认绑定模式值。   但是,默认值因每个依赖项属性而异。在   一般的,用户可编辑的控件属性,例如文本框的属性   和复选框,默认为双向绑定,而大多数其他   属性默认为单向绑定。

(来源:MSDN

所以一般情况下可以编辑通常不需要通知

现在,为了让你的组合框正常工作,试试这个。

我经常使用它并且完美地运作

<DataGridComboBoxColumn Header="Early OT Time Rounding" 
                        DisplayMemberPath="Key"  
                        SelectedValuePath="Value" 
                        SelectedValueBinding="{Binding EarlyOTRounding, UpdateSourceTrigger=PropertyChanged}"   
                        >
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.ThreeTimeFormat, UpdateSourceTrigger=PropertyChanged}"/>
            <Setter Property="Width" Value="280" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.ThreeTimeFormat, UpdateSourceTrigger=PropertyChanged}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

关注此 DataGridComboBoxColumn必须将SelectedValueBinding属性设置为EmployeeTypeList中的项目,以便在列表中更改所选值

在你的情况下:

SelectedValueBinding="{Binding EarlyOTRounding, UpdateSourceTrigger=PropertyChanged}"