C# 设置延迟以更新UWP中绑定中的目标

C# 设置延迟以更新UWP中绑定中的目标,c#,binding,uwp,C#,Binding,Uwp,我绑定ListView的SelectedValue,此绑定使用转换器。 我希望在延迟后执行ConvertBack方法,这在WPF中似乎很容易,但在UWP中却不容易。 如何执行此操作?如果您只想延迟转换,则可以使用任务并调用task.Result返回值。例如: public object ConvertBack(object value, Type targetType, object parameter, string language) { var val = value.ToStri

我绑定ListView的
SelectedValue
,此绑定使用转换器。 我希望在延迟后执行
ConvertBack
方法,这在
WPF
中似乎很容易,但在
UWP
中却不容易。
如何执行此操作?

如果您只想延迟
转换
,则可以使用任务并调用
task.Result
返回值。例如:

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
    var val = value.ToString();
    var task = Task.Run(async () =>
    {
        await Task.Delay(1000);
        return val;
    });
    return task.Result;
}
public class IndexToItemConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        Debug.WriteLine("CONVERT");
        return Int32.Parse(value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        var val = value.ToString();
        var task = Task.Run(async () =>
        {
            await Task.Delay(1000);
            return val;
        });
        return task.Result;
    }
}
对于我使用此代码的场景,我使用双向绑定将
列表视图的
SelectedIndex
绑定到
文本框的
文本,下面是演示:

<Page.DataContext>
    <local:BlankPage6ViewModel x:Name="ViewModel" />
</Page.DataContext>
<Page.Resources>
    <local:IndexToItemConverter x:Key="cvt" />
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="4*" />
    </Grid.RowDefinitions>
    <TextBox x:Name="tb" Text="5" Height="50" />
    <ListView ItemsSource="{Binding MyItems}"
          SelectionMode="Single"
          SelectedIndex="{Binding ElementName=tb, Path=Text, Mode=TwoWay, Converter={StaticResource cvt}}" Grid.Row="1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding ID}" />
                    <TextBlock Text="{Binding Name}" Margin="5,0" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
正在呈现此演示的图像:


这个场景有一个非常好的博客,你可以看看:。

基于,你的关键问题仍然是在第一次加载项目时设置所选项目,如果使用
SelectedIndex
SelectedItem
而不是
SelectedValue
,这对您的场景合适吗?@GraceFeng MSFT:不,这是另一个问题。请不要这样做。它会完全阻止你的UI线程并暂停应用程序(你甚至可以在上面的gif中看到它)。永远不要使用Task.Result。最好在设定者被击中后让设定者提升属性改变一秒钟。@dotMortend是个好建议。
public class IndexToItemConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        Debug.WriteLine("CONVERT");
        return Int32.Parse(value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        var val = value.ToString();
        var task = Task.Run(async () =>
        {
            await Task.Delay(1000);
            return val;
        });
        return task.Result;
    }
}