只有数据模板列中的最后一个控件得到更新

Only last control in Data Template column getting updated

我有一个 DataTemplate 列,其中 2 DatePickers 绑定到 2 个属性。当这些控件中的数据更改时,仅更新最后一个控件

        <sdk:DataGridTemplateColumn Width="300"  CanUserReorder="False" >              
         <sdk:DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                 <Grid MouseRightButtonDown="ActionsGrid_MouseRightButtonDown" Width="300" Height="40" MouseLeftButtonDown="ActionsGrid_MouseLeftButtonDown">
                        <StackPanel Orientation="Horizontal">
                             <TextBlock VerticalAlignment="Stretch" Width="100" Text="{Binding Start,  Converter={StaticResource DateConverter}}"
                                         Padding="2" HorizontalAlignment="Center" />
                             <TextBlock VerticalAlignment="Stretch" Width="100" Text="{Binding Due, Converter={StaticResource DateConverter}}"
                                         Padding="2" HorizontalAlignment="Center" />
                         </StackPanel>
                  </Grid>
                </DataTemplate>                                                  
          </sdk:DataGridTemplateColumn.CellTemplate>
    <sdk:DataGridTemplateColumn.CellEditingTemplate>
               <DataTemplate>
                     <StackPanel Orientation="Horizontal">
                       <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Start, Mode=TwoWay,}" Padding="2" />
                       <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Due, Mode=TwoWay, ValidatesOnDataErrors=True}"  Padding="2" />
                     </StackPanel>
               </DataTemplate>  
     </sdk:DataGridTemplateColumn.CellEditingTemplate>
   </sdk:DataGridTemplateColumn>

在这种情况下,如果我同时更新 Start 和 Due,只有 Due 得到更新。此外,绑定工作正常,因为如果我在我的模型 class 中的 Start 上放置一个断点,它会被击中,但传递的值是 Start

的原始值

编辑 1

经过一些调试后,我发现如果我的 DataTemplate 中只有一个控件,它就可以正常工作。此外,当我更改日期时,断点会立即被击中。但是,如果我有多个控件,则在我将焦点移出列之前不会触发断点,然后只有最后一个绑定有效。

编辑 2

经过一些 mroe 调试后,我注意到如果我只使用 CellTemplate 并丢弃单元格 EditTemplate

,它会工作正常
     <sdk:DataGridTemplateColumn Width="300"  CanUserReorder="False" >              
             <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                   <StackPanel Orientation="Horizontal">
                       <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Start, Mode=TwoWay,}" Padding="2" />
                       <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Due, Mode=TwoWay, ValidatesOnDataErrors=True}"  Padding="2" />
                  </StackPanel>
               </DataTemplate>  
     </sdk:DataGridTemplateColumn.CellEditingTemplate>
   </sdk:DataGridTemplateColumn>

编辑 3

private void DatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            (sender as DatePicker).GetBindingExpression(DatePicker.SelectedDateProperty).UpdateSource();
        }

我能够使用 selectedDatechange 事件刷新控件上的绑定,然后刷新发送者上的绑定。

我仍然不确定为什么 2 方式绑定不起作用。

谁能解释为什么会这样?

编辑 4

模型和属性

 public DateTime? Start 
        { 
            get { return _Start; } 
            set 
            { 
                _Start = value; Dirty = true; 

                if (_Start.HasValue && _Due.HasValue && _Start.Value > _Due.Value)
                    _dataErrors["Start"] = "Start date cannot be greater than the Due date";
                else
                    if (_dataErrors.ContainsKey("Start"))
                        _dataErrors.Remove("Start");
                NotifyPropertyChanged(); NotifyPropertyChanged("CalcStatus");
            } 
        }
        public DateTime? Due 
        { 
            get { return _Due; } 
            set 
            { 
                _Due = value; Dirty = true; 
                if (_Start.HasValue && _Due.HasValue && _Start.Value > _Due.Value)
                    _dataErrors["Start"] = "Start date cannot be greater than the Due date";
                else
                    if (_dataErrors.ContainsKey("Start"))
                        _dataErrors.Remove("Start");
                NotifyPropertyChanged("Due"); NotifyPropertyChanged("CalcStatus");
            }
        }

好的,我想我终于修好了。我仍然不是 100% 确定为什么它不起作用,但我将创建一个新的小项目并尝试找出原因。

发生的事情是我通过传递 [CallerMemberName] 修改了我的 NoitifyPropertyChangedEvent,以便自动传递调用它的 属性 的名称。这意味着如果我更改名称 属性 例如 "Start" 我不必担心更新 NotifyPropertyChanged("Start").

 public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] string propertyName =null)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

除了我有 DataTemplateColumn 的情况外,这对所有属性都有效。 将其转换回标准代码并传递 属性Name 明确解决了我的问题。

public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }