仅在更新文本块时运行的转换器

本文关键字:运行 转换器 更新 文本 | 更新日期: 2023-09-27 18:30:46

>转换器

public object Convert(object values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (values != null)
    {
        string t = values.ToString();
        string date = t.Substring(0, t.IndexOf(" "));
        string time = DateTime.Now.ToString("h:mm tt");
        return (date + " " + time);
    }
    return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    throw new NotImplementedException();
}
=====================================================================================================================================================================================================================================================

===

XAML

<DataGridTemplateColumn Header="Start">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Start, Converter={StaticResource fixdate}}"  />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <DatePicker SelectedDate="{Binding Start}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

如何仅在 texblock 更新后运行我的转换器。 它现在的工作方式是,一旦我使用日期选择器选择一个日期,它就会填充文本块中的日期/时间,但是当我单击保存时,转换器再次运行,这会改变时间。如何让此转换器仅在文本块更新时运行。我也知道转换器中的 if 测试需要更改,我只是在玩弄它,看看我是否可以让它工作

仅在更新文本块时运行的转换器

仅当Binding认为有新值要绑定时,才会运行Converter。我猜当您单击"保存"时会发生以下情况之一:

1:代码重置项的Start属性:

item.Start = updatedDate;

*)这与您已经检查过的@nit的建议相同。

2:在项目集合中,替换刚刚保存的项目:

myList.Remove(oldItem);
myList.Add(updatedItem);

3:替换绑定到DataGrid的整个项目列表;

myGrid.ItemsSource = updatedList;

正如 Sphinxxx 所写,当绑定认为值发生变化时,将调用转换器。

要做的一件事是检查您的保存方法,那里没有任何可能导致这种情况。

另一个选项是将 UpdateSourceTrigger 设置为 Explicit,然后在 DatePicker 中选择新日期后更新绑定。我猜想,如果你这样做,就不会发生预兆。显式更新是这样的(IsEnable 属性的绑定按钮示例):

    BindingExpression be = MyButton.GetBindingExpression(Button.IsEnabledProperty);
    be.UpdateTarget();