2016-11-23 57 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