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

时间:2013-09-09 17:51:52

标签: c# wpf xaml wpf-controls

转换器

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更新后才运行我的转换器。它现在的工作方式是我选择一个日期选择器的日期,它填充文本块中的日期/时间,但是当我点击保存时,转换器正在再次运行,这正在改变时间。如何才能使此Converter仅在文本块更新时运行。我也知道转换器中的测试是否需要更改我只是在玩它,看看我是否可以让它工作

2 个答案:

答案 0 :(得分:1)

Converter仅在Binding认为存在要绑定的新值时运行。 我猜你单击“保存”时会出现其中一种情况:

1:您的代码重置了项目的Start属性:

item.Start = updatedDate;

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

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

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

3:替换绑定到DataGrid;

的整个项目列表
myGrid.ItemsSource = updatedList;

答案 1 :(得分:1)

正如Sphinxxx所写,当Binding认为值发生变化时,会调用Converter。

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

另一个选项是将UpdateSourceTrigger设置为Explicit,然后在DatePicker中选择新日期后更新Binding。我认为如果你这样做,问题将不会发生。 Doint显式更新就是这样(一个带有IsEnable属性绑定的Button的例子):

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