2016-11-23 67 views
0

我绑定我的ListView和这个绑定使用转换器SelectedValue。 我想ConvertBack方法延迟执行后,似乎很容易在WPF而不是在UWP。 我该怎么做?设置延迟更新目标在UWP绑定

+0

基于[你的最后一种情况](http://stackoverflow.com/questions/40741754/how-to-load-itemssource-before-setting-selecteditem-in-listview),你的关键问题仍然是设置选中当第一次加载项目时,如果使用'SelectedIndex'或'SelectedItem'而不是'SelectedValue',那么对于你的场景来说可以吗? –

+0

@ GraceFeng-MSFT:不,这是另一个问题。 – Maryam

回答

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> 

视图模型和模型:

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

渲染这个演示的图像: enter image description here

有一个非常好的博客对于这种情况,你可以看看:Async Programming : Patterns for Asynchronous MVVM Applications: Data Binding