2016-11-23 1 views
0

Ich binde SelectedValue meiner ListView und dieser Bindung verwendet Konverter. Ich möchte, dass ConvertBack Methode nach einer Verzögerung ausgeführt werden, scheint es einfach in WPF, aber nicht in UWP. Wie kann ich das tun?Einstellung Verzögerung zu aktualisieren Target in Binding in UWP

+0

Basierend auf [Ihrem letzten Fall] (http://stackoverflow.com/questions/40741754/how-to-load-itemssource-before-setting-selecteditem-in-listview), Schlüssel Problem ist immer noch eine ausgewählte Wenn beim ersten Mal die Elemente geladen werden, ist das für Ihr Szenario OK, wenn Sie 'SelectedIndex' oder' SelectedItem' anstelle von 'SelectedValue' verwenden? –

+0

@ GraceFeng-MSFT: Nein, es ist eine andere Frage. – Maryam

Antwort

1

Wenn Sie nur Ihre ConvertBack verzögern möchten, können Sie eine Aufgabe verwenden und Task.Result aufrufen, um Ihren Wert zurückzugeben. Zum Beispiel wie folgt aus:

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

Für das Szenario, das ich diesen Code verwendet, verwende ich zwei Art und Weise die SelectedIndex eines ListView zum Text eines TextBox, hier ist die Demo zu binden Bindung:

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

Ansichtsmodell und Modell:

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

Der ganze Konverter ist einfach so:

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

Rendering-Bild dieser Demo: enter image description here

Es gibt ein sehr gutes Blog für dieses Szenario ist, können Sie einen Blick: Async Programming : Patterns for Asynchronous MVVM Applications: Data Binding.

Verwandte Themen