【问题标题】:setting delay to update target in Binding in UWP设置延迟以在 UWP 中的绑定中更新目标
【发布时间】:2016-11-24 17:03:24
【问题描述】:

我绑定了我的 ListView 的SelectedValue,并且这个绑定使用了转换器。 我希望在延迟后执行ConvertBack 方法,在WPF 中似乎很容易,但在UWP 中则不然。 我该怎么做?

【问题讨论】:

  • 基于your last case,您的关键问题仍然是在第一次加载项目时设置选定的项目,如果使用SelectedIndexSelectedItem 而不是@,是否适合您的场景987654328@?
  • @GraceFeng-MSFT:不,这是另一个问题。

标签: c# binding uwp


【解决方案1】:

如果您只想延迟ConvertBack,那么您可以使用任务并调用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;
}

对于我使用此代码的场景,我使用两种方式绑定将ListViewSelectedIndex 绑定到TextBoxText,这是演示:

<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>

ViewModel 和模型:

public class BlankPage6ViewModel
{
    public BlankPage6ViewModel()
    {
        MyItems = new ObservableCollection<IDModel>();
        for (int i = 0; i < 50; i++)
        {
            MyItems.Add(new IDModel { ID = i, Name = "Name " + i });
        }
    }

    public ObservableCollection<IDModel> MyItems { get; set; }
}

public class IDModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}

整个转换器就这么简单:

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;
    }
}

此演示的渲染图像:

这个场景有一篇很不错的博客,大家可以看看:Async Programming : Patterns for Asynchronous MVVM Applications: Data Binding

【讨论】:

  • 不要这样做。它完全阻塞了你的 UI 线程并停止了应用程序(你甚至可以在上面的 gif 中看到它)。永远不要使用 Task.Result。最好让你的二传手在二传手被击中后提高 PropertyChanged。
  • @dotMortend 好建议。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多