2016-04-15 16 views
0

XAML、Univeral Apps、ReactiveUIの完全な初心者です。ListBoxはReactiveUIのUWPに実装されていません

ReactiveUIのハンドルを取得するには、ReactiveUI WPF Flickrサンプルをドキュメント(Reactive UI 101)からWindows Universal Appに移植しようとしました。私はVisual Studio 2015、ReactiveUI 6.5と更新されたSplatを使用しています。

コードをコピーし、UWP用にコンパイルするために必要な変更を加えました。現在のコードはコンパイルとオープンが行われますが、正しく動作しません。

  1. 私は検索の外側をクリックする必要があります:ボックスFlickrの写真検索をキックする

    私は2つの問題を抱えています。私が理解したところから、私はクリックしてはならないはずです。それは、私が何かをタイプして、800msのタイムアウト後に検索を蹴飛ばすだけです。写真の検索をデバッグすると、オブジェクトのコレクションが検索結果として返されます。

  2. 2番目の問題は、結果のリストが表示されても、ListBoxにデータが入力されないことです。私は、サンプルに示されているようにBindingを使ってみました。また、x:Bindを使ってみましたが、私はすべてのUWPチュートリアルで何もしませんでした。

私は別のUWPのサンプル(RxUI and UWP .Net Native Sample)をダウンロードし、私は逃したものを見るために、それの構造とセットアップに探していますが、それは今の私にはもう少し複雑です。

誰かが正しい方向に私を指すことができれば、それは多くの助けになります。

ここに私のXAMLです:

<Page 
x:Class="ReactiveUIFlickerApp.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:ReactiveUIFlickerApp" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:data="using:ReactiveUIFlickerApp.Models" 
x:Name="MainPageView" 
mc:Ignorable="d"> 

<Page.Resources> 
    <DataTemplate x:Key="PhotoDataTemplate" 
        x:DataType="data:FlickrPhoto"> 
     <Grid MaxHeight="100"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 

      <Image Source="{x:Bind Url, Mode=OneWay}" Margin="6" MaxWidth="128" 
        HorizontalAlignment="Center" VerticalAlignment="Center" /> 

      <StackPanel Grid.Column="1" Margin="6"> 
       <TextBlock FontSize="14" FontWeight="Bold" Text="{x:Bind Title}" /> 
       <TextBlock FontStyle="Italic" Text="{x:Bind Description}" 
          TextWrapping="Wrap" Margin="6" /> 
      </StackPanel> 
     </Grid> 
    </DataTemplate> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
     Margin="12"> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <TextBlock FontSize="16" 
       FontWeight="Bold" 
       VerticalAlignment="Center">Search For:</TextBlock> 

    <TextBox Grid.Column="1" 
      Margin="6,0,0,0" 
      Text="{x:Bind PageViewModel.SearchTerm, Mode=TwoWay}"/> 

    <TextBlock Grid.Column="2" 
       Margin="6,0,0,0" 
       FontSize="16" 
       FontWeight="Bold" 
       Text="..." 
       Visibility="{x:Bind PageViewModel.SpinnerVisibility}" /> 

    <ListBox Grid.ColumnSpan="3" 
      Grid.Row="1" 
      Margin="0,6,0,0" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      ItemsSource="{x:Bind PageViewModel.SearchResults, Mode=OneWay}" 
      ItemTemplate="{StaticResource PhotoDataTemplate}" /> 
</Grid> 

XAMLコードビハインド:

public sealed partial class MainPage : Page 
{ 
    public MainPageViewModel PageViewModel { get; private set;} 

    public MainPage() 
    { 
     PageViewModel = new MainPageViewModel(); 

     this.InitializeComponent(); 
    } 
} 

MainPageViewModel(溶液中で、独自のViewフォルダ内):

public class MainPageViewModel : ReactiveObject 
{ 
    string _SearchTerm; 
    public string SearchTerm 
    { 
     get { return _SearchTerm; } 
     set { this.RaiseAndSetIfChanged(ref _SearchTerm, value); } 
    } 

    public ReactiveCommand<List<FlickrPhoto>> ExecuteSearch { get; protected set; } 

    ObservableAsPropertyHelper<List<FlickrPhoto>> _SearchResults; 
    public List<FlickrPhoto> SearchResults => _SearchResults.Value; 

    ObservableAsPropertyHelper<Visibility> _SpinnerVisibility; 
    public Visibility SpinnerVisibility => _SpinnerVisibility.Value; 



    public MainPageViewModel() 
    { 
     ExecuteSearch = 
      ReactiveCommand.CreateAsyncTask(parameter => GetSearchResultsFromFlickr(this.SearchTerm)); 


     this.WhenAnyValue(x => x.SearchTerm) 
      .Throttle(TimeSpan.FromMilliseconds(800), RxApp.MainThreadScheduler) 
      .Select(x => x?.Trim()) // null conditional operator 
      .DistinctUntilChanged() 
      .Where(x => !String.IsNullOrWhiteSpace(x)) 
      .InvokeCommand(ExecuteSearch); 

     _SpinnerVisibility = ExecuteSearch.IsExecuting 
      .Select(x => x ? Visibility.Visible : Visibility.Collapsed) 
      .ToProperty(this, x => x.SpinnerVisibility, Visibility.Collapsed/*Hidden*/); 

     ExecuteSearch.ThrownExceptions.Subscribe(ex => { Debug.WriteLine(ex.ToString());/* Handle errors here */}); 

     _SearchResults = ExecuteSearch.ToProperty(this, x => x.SearchResults, new List<FlickrPhoto>()); 
    } 

    public static async Task<List<FlickrPhoto>> GetSearchResultsFromFlickr(string searchTerm) 
    { 

     var client = new HttpClient(); 
     var stream = await client.GetStreamAsync(String.Format(CultureInfo.InvariantCulture, 
      "http://api.flickr.com/services/feeds/photos_public.gne?tags={0}&format=rss_200", 
      WebUtility.UrlEncode(searchTerm))); 

     //var doc = await Task.Run(() => XDocument.Load(String.Format(CultureInfo.InvariantCulture, 
     // "http://api.flickr.com/services/feeds/photos_public.gne?tags={0}&format=rss_200", 
     // WebUtility.UrlEncode(searchTerm)))); 

     var doc = await Task.Run(() => XDocument.Load(stream)); 

     if (doc.Root == null) 
      return null; 

     var titles = doc.Root.Descendants("{http://search.yahoo.com/mrss/}title") 
      .Select(x => x.Value); 

     var tagRegex = new Regex("<[^>]+>", RegexOptions.IgnoreCase); 
     var descriptions = doc.Root.Descendants("{http://search.yahoo.com/mrss/}description") 
      .Select(x => tagRegex.Replace(WebUtility.HtmlDecode(x.Value), "")); 
      //.Select(x => tagRegex.Replace(HttpUtility.HtmlDecode(x.Value), "")); 

     var items = titles.Zip(descriptions, 
      (t, d) => new FlickrPhoto { Title = t, Description = d }).ToArray(); 

     var urls = doc.Root.Descendants("{http://search.yahoo.com/mrss/}thumbnail") 
      .Select(x => x.Attributes("url").First().Value); 

     var ret = items.Zip(urls, (item, url) => { item.Url = url; return item; }).ToList(); 
     return ret; 
    } 
} 
は、

答えて

0

私コントロールがフォーカスを失うまでyour issue on Githubへの私の応答で述べた、UWPはTextBoxバインディングを更新しません。この問題を回避するには、RxUI Bindファミリを使用する必要があります。結果リストについては

、私は正確に必ずそれは私がReactiveList<T>(または可能性が高い、IReadOnlyReactiveList<T>)に結合されることを除いて働いていない理由としてありませんよ。そうすれば、がバインドされているList<T>を破棄する代わりに、ReactiveList<T>INotifyPropertyChangedを使用します。

あなたが働いていることを得れば、一般的に良い仕事しますReactiveCommand労働者の体内にリストの人口コードを移動してみてください。

+0

おかげで、私はまだ、どこ変更を加えることを把握しようとしている概念とシンタックスシュガーで迷子に...あなたが更新され続けます。 – SheriSteeves

関連する問題