0
私のListViewとこのバインディングを使用するコンバータのSelectedValue
をバインドします。 ConvertBack
メソッドを遅れて実行したいと思っていますが、それはWPF
では簡単だと思われますが、UWP
ではありません。 どうすればいいですか?UWPのバインディングでターゲットを更新するまでの遅延を設定する
私のListViewとこのバインディングを使用するコンバータのSelectedValue
をバインドします。 ConvertBack
メソッドを遅れて実行したいと思っていますが、それはWPF
では簡単だと思われますが、UWP
ではありません。 どうすればいいですか?UWPのバインディングでターゲットを更新するまでの遅延を設定する
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;
}
、私はTextBox
のText
にListView
のSelectedIndex
をバインドするために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:このシナリオのための非常に良いブログがあり
、あなたが見ることができます。
[あなたの最後のケース](http://stackoverflow.com/questions/40741754/how-to-load-itemssource-before-setting-selecteditem-in-listview)に基づいて、キーの問題はまだ選択されたものを設定しています最初にアイテムがロードされたときに、 'SelectedValue'の代わりに' SelectedIndex'または 'SelectedItem'を使用すると、あなたのシナリオでは問題ありませんか? –
@ GraceFeng-MSFT:いいえ別の質問です。 – Maryam