2016-11-23 5 views
0

私のListViewとこのバインディングを使用するコンバータのSelectedValueをバインドします。 ConvertBackメソッドを遅れて実行したいと思っていますが、それはWPFでは簡単だと思われますが、UWPではありません。 どうすればいいですか?UWPのバインディングでターゲットを更新するまでの遅延を設定する

+0

[あなたの最後のケース](http://stackoverflow.com/questions/40741754/how-to-load-itemssource-before-setting-selecteditem-in-listview)に基づいて、キーの問題はまだ選択されたものを設定しています最初にアイテムがロードされたときに、 'SelectedValue'の代わりに' SelectedIndex'または 'SelectedItem'を使用すると、あなたのシナリオでは問題ありませんか? –

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

、私はTextBoxTextListViewSelectedIndexをバインドするために2つの結合方法を使用し、ここでのデモは、次のとおりです。

<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とModel:

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:このシナリオのための非常に良いブログがあり enter image description here

、あなたが見ることができます。

関連する問題