2014-06-19 2 views
0

내가 한 페이지에 두 개의 컨트롤을 제어합니다
1 RadSlider
2. 목록 상자MVVM 기반 항목

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="100"></RowDefinition> 
     </Grid.RowDefinitions> 
     <telerik:RadSlideView Name="imgSlidView" > 

     <telerik:RadSlideView.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding Src}"></Image> 
      </DataTemplate> 
      </telerik:RadSlideView.ItemTemplate> 
      <telerik:RadSlideView.ItemPreviewTemplate> 
       <DataTemplate> 
        <telerik:RadBusyIndicator></telerik:RadBusyIndicator> 
       </DataTemplate> 

      </telerik:RadSlideView.ItemPreviewTemplate> 
     </telerik:RadSlideView> 

     <ListBox Grid.Row="1" Name="lstImage"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"></StackPanel> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Image Height="100" Margin="0,0,5,0" Source="{Binding Src}"></Image> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

나는 하나의 항목에 두 개의 컨트롤을 바인딩 할 하나의 선택을 변경하면 다른 사람의 선택도 변경되어야합니다.
MVVM 기반 솔루션에 관심이 있습니다. 내 코드 :이 외에도

class CategoryViewModel : ViewModelBase 
{ 
    public ObservableCollection<ImageSource> ImageCollection { get; set; } 
    private ImageSource _CurrentImage; 

    public ImageSource CurrentImage 
    { 
     get { return _CurrentImage; } 
     set 
     { 
      _CurrentImage = value; 
      RaisePropertyChanged("CurrentImage"); 
     } 
    } 
} 

내가는 IEnumerable을 반환 코드의 조각을 가지고 있고 나는이 항목 소스로되고 싶어요.

public static async Task<IEnumerable<Object>> GetCategoryNames() 
    { 
     if (Categories == null) 
     { 
      JDir dir = Newtonsoft.Json.JsonConvert.DeserializeObject<JDir>(await LoadFromJson()); 
      Categories = ConvertJDirToCategory(dir); 
      return Categories.Select(p => new { Name = p.Name, Src = "Images/" + p.Name + ".jpg" }); 
     } 
     else 
     { 
      return Categories.Select(p => new { Name = p.Name, Src = "Images/" + p.Name + ".jpg" }); 
     } 
    } 

올바른 방법으로하고 있습니까? 어떻게해야합니까?

미리 감사드립니다.

편집 - 의견 :

private static async Task<string> LoadFromJson() 
{ 
    string theData = string.Empty; 
    StorageFile file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///data.json")); 
    using (StreamReader streamReader = new StreamReader(await file.OpenStreamForReadAsync()))    
    { 
     return await streamReader.ReadToEndAsync();   
    }   
} 
+0

어떻게 '구현 LoadFromJson'입니까? –

+0

설치 폴더에서'private static async 작업 LoadFromJson() { 문자열 theData = string.Empty; StorageFile 파일 = Windows.Storage.StorageFile.GetFileFromApplicationUriAsync (새 Uri ("ms-appx : ///data.json")); using (StreamReader streamReader = 새 StreamReader (파일 대기 열기, OpenStreamForReadAsync()) { return return streamReader.ReadToEndAsync(); } } –

+0

이게 맞습니까? 문제가 무엇인가요? 왜 GetCategoryNames의 결과를 콜렉션에 바인딩하지 않을까요? –

답변

0

덕분에 모든 몸이, 내 문제는 이제 해결되었습니다

XAML :

DataContext="{Binding Category, Source={StaticResource Locator}}" 

두 컨트롤 :

 <telerik:RadSlideView Name="imgSlidView" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" ItemsSource="{Binding Images}"> 

      <telerik:RadSlideView.ItemTemplate> 
       <DataTemplate> 
        <Image Source="{Binding}"> 
         <telerik:RadContextMenu.ContextMenu> 
          <telerik:RadContextMenu IsZoomEnabled="False" OpenGesture="Tap"> 
           <telerik:RadContextMenuItem Tap="RadContextMenuItem_Tap" Content="Share"> 

           </telerik:RadContextMenuItem> 
          </telerik:RadContextMenu> 
         </telerik:RadContextMenu.ContextMenu> 
        </Image> 
       </DataTemplate> 
      </telerik:RadSlideView.ItemTemplate> 
      <telerik:RadSlideView.ItemPreviewTemplate> 
       <DataTemplate> 
        <telerik:RadBusyIndicator></telerik:RadBusyIndicator> 
       </DataTemplate> 

      </telerik:RadSlideView.ItemPreviewTemplate> 
     </telerik:RadSlideView> 

     <ListBox Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Auto" Name="lstImage" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" ItemsSource="{Binding Images}"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"></StackPanel> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Image Height="100" Margin="0,0,5,0" Source="{Binding}"> 

        </Image> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

보기 모델 :

public class CategoryViewModel : ViewModelBase 
{ 
    private string _CategoryName; 

    public string CategoryName 
    { 
     get { return _CategoryName; } 
     set 
     { 
      DispatcherHelper.CheckBeginInvokeOnUI(() => { Set<string>(ref _CategoryName, value); }); 
     } 
    } 

    private Uri _SelectedItem; 

    public Uri SelectedItem 
    { 
     get { return _SelectedItem; } 
     set 
     { 
      DispatcherHelper.CheckBeginInvokeOnUI(() => { Set<Uri>(ref _SelectedItem, value); }); 
     } 
    } 


    private ObservableCollection<Uri> _Images; 

    public ObservableCollection<Uri> Images 
    { 
     get { return _Images; } 
     set { Set<ObservableCollection<Uri>>(ref _Images, value); } 
    } 

    public CategoryViewModel() 
    { 
     CategoryName = string.Empty; 
     Images = new ObservableCollection<Uri>(); 
    } 

} 

XAML.cs

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 
     string Category = string.Empty; 
     NavigationContext.QueryString.TryGetValue("category", out Category); 

     if (this.DataContext is CategoryViewModel) 
     { 
      var vm = (CategoryViewModel)this.DataContext; 
      vm.Images.Clear(); 
      JSONHelper.LoadFromJson().ContinueWith(t => 
      { 
       vm.CategoryName = Category; 
       var images = t.Result.Dirs.FirstOrDefault(p => p.DirName == Category).Files; 
       Dispatcher.BeginInvoke(() => 
       { 
        foreach (var img in images) 
        { 

         vm.Images.Add(new Uri(string.Format("Data/{0}/{1}", Category, img), UriKind.Relative)); 
        } 
       }); 

      }); 
     } 
    } 
관련 문제