2016-03-23 3 views
0

Я пытаюсь привязать параметр моего настраиваемого элемента управления к списку. Однако он ищет неправильную ViewModel. Он выполняет поиск в режиме ViewModel моего элемента управления (ViewModelUserControlVM), а не в ViewModel страницы, на которой находится мой элемент управления.Проблема с привязкой к пользовательскому контролю (Windows universal 10)

управления пользователя XAML

<UserControl.DataContext> 
    <vm:ViewModelUserControlVM/> 
</UserControl.DataContext> 

<ListView Name="lst"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

контроль код пользователя за

public object ItemsSource 
    { 
     get 
     { 
      return (object)GetValue(ItemsSourceProperty); 
     } 
     set 
     { 
      SetValue(ItemsSourceProperty, value); 
     } 
    } 

    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register 
     (
     "ItemsSource", 
     typeof(object), 
     typeof(FlipListview), 
     new PropertyMetadata(
      new object(), 
      new PropertyChangedCallback(OnItemsSourceChanged) 
     ) 
    ); 

Главная XAML

<local:CustomControl ItemsSource="{Binding list, Mode=TwoWay}"> 

редактировать

MainPage.xaml

<Page.DataContext> 
    <vm:MainPageVM/> 
</Page.DataContext> 

MainPageVM

public class MainPageVM : ViewModelBase 
    { 
    public List<Model> list { get; set; } 
    public RelayCommand SelectedItemCommand { get; set; } 

    public Model SelectedItem { get; set; } 

    public MainPageVM() 
    { 
     SelectedItem = new Model(); 
     SelectedItemCommand = new RelayCommand(SelectedItem); 

     list = new List<Model>(); 

     for (int i = 0; i < 5; i++) 
     { 
      list.Add(new Model("url" + i, "title" + i, "desc" + i)); 
     } 
     RaisePropertyChanged(() => list); 
    } 
    } 

контрольный код пользователя за

 public CustomControl() 
     { 
     this.InitializeComponent(); 
     } 

заранее спасибо.

ответ

0

Если DataContext вашего UserControl является ViewModelUserControlVM, любые Наручники в нем будет выглядеть, что DataContext , Если вам необходим родительский элемент управления для привязки к свойству зависимости, чтобы передать что-то из его (родительского элемента управления) DataContext, вы можете установить DataContext главной панели UserControls (Grid, StackPanel и т. Д.) В ViewModelUserControlVM. Это приведет к тому, что сам элемент управления будет выглядеть «вверх» в визуальном дереве, чтобы найти DataContext. В этом случае ваша модель просмотра MainPage.

По части совместного использования вы пытаетесь связать свойство зависимостей ItemsSource с чем-то в MainPage, но затем переопределить DataContext UserControl, назначив весь DataContext UserControl для другой модели представления.

Более полный код будет поддерживать или оспаривать эту теорию.

обновление ниже

Спасибо за дополнительный код. Пока неясно, какова конечная цель - например, выбранный элемент упоминается, но не используется, и мы не знаем релевантности модели просмотра пользовательского элемента управления. Итак, я собрал кое-что, что просто отображает список в главной модели и привязывается к usercontrol, который ищет список этого типа. Надеюсь, это поможет вам, где вы пытаетесь пойти ... (примечание: я использовал библиотеку MVVMLight)

MainPageVM:

public class MainPageVM : ViewModelBase 
    { 
     private List<Model> _list = new List<Model>(); 
     public List<Model> list 
     { 
      get { return _list; } 
      set { Set(ref _list, value); } 
     } 



     public MainPageVM() 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       list.Add(new Model("url" + i, "title" + i, "desc" + i)); 
      } 
      RaisePropertyChanged(() => list); 
     } 
    } 

MainPage XAML (DataContext является MainVM):

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

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <local:CustomControl ItemsSource="{Binding list, Mode=OneWay}" /> 
    </Grid> 
</Page> 

CustomControl код позади (обратите внимание на установку DataContext в CTOR - DataContext управления - это то, что его использует, но элементы управления внутри сетки LayoutRoot будут использовать свойства зависимостей элемента управления):

public CustomControl() 
     { 
      this.InitializeComponent(); 
      LayoutRoot.DataContext = this; 
     } 



     public List<Model> ItemsSource 
     { 
      get { return (List<Model>)GetValue(ItemsSourceProperty); } 
      set { SetValue(ItemsSourceProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for ItemsSource. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty ItemsSourceProperty = 
      DependencyProperty.Register("ItemsSource", typeof(List<Model>), typeof(CustomControl), new PropertyMetadata(null, new PropertyChangedCallback(OnItemsSourceChanged))); 

     private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 

     } 
    } 

CustomControl XAML:

<UserControl 
    x:Class="App8.CustomControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App8" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot"> 
     <ListView Name="lst" ItemsSource="{Binding ItemsSource, Mode=OneWay}" 
        DisplayMemberPath="Url"> 
     </ListView> 
    </Grid> 
</UserControl> 

В двух словах, ItemSource в ListView является обязан независимо от свойства зависимостей ItemsSource CustomControl есть. Элемент DataContext элемента ItemsControl - это то, что DataContext использует элемент управления. Надеюсь, это поможет вам.

+0

Я отредактировал мое сообщение, чтобы добавить больше кода. – denderp

+0

это близко, но теперь моя привязка в моем CustomControl не работает. это привязка к элементу управления в стиле, который я применяю к Listview. – denderp

+0

Я пытаюсь работать. в загруженном событии я делаю это. Стиль templatedControl = ((CustomControl) отправитель) .lst.Style; SetterBaseCollection set = templatedControl.Setters; Список list = set.ToList (); Setter setter = (Setter) list [13]; Однако я не могу получить элементы управления в этом сеттере. который является контрольным шаблоном. – denderp

0

Может быть, это будет выглядеть так:

<local:CustomControl ItemsSource="{x:Bind ViewModel.list, Mode=TwoWay}"> 

Вы можете найти дополнительную информацию о х: Bind here

+0

Мне не нравится использовать x: bind, потому что он не использует ViewModel. – denderp