gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:53:08 25 4
gpt4 key购买 nike

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

        <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 得到更新。此外,绑定(bind)工作正常,因为如果我在我的模型类中的 Start 上放置一个断点,它会被击中,但传递的值是 Start 的原始值

编辑 1

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

编辑 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 事件刷新控件上的绑定(bind),然后刷新发送者上的绑定(bind)。

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

谁能解释为什么会这样?

编辑 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% 确定它为什么不起作用,但我会创建一个新的小项目并尝试找出原因。

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

 public event PropertyChangedEventHandler PropertyChanged;

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

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

public event PropertyChangedEventHandler PropertyChanged;

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

关于c# - 只有数据模板列中的最后一个控件得到更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38986123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com