2016-07-25 5 views
0

Связывание ListBox внутри пользовательского элемента управленияСвязывание ListBox внутри пользовательского элемента управления .Cannot Свяжите это

Я строю пользовательский элемент управления, который будет иметь ListBox inside.I выложили здесь упрощенный вариант

I похоже, не отображает свойство моей связанной viewModel. «Фамилия».

Не могли бы вы увидеть, что я делаю неправильно?

Generic.xaml (внутри CustomControl)

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:local="clr-namespace:WpfCustomControlLibrary1.SimpleList"> 
     <Style TargetType="{x:Type local:SimpleListControl}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type local:SimpleListControl}"> 
         <Border Background="{TemplateBinding Background}" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}"> 

          <Grid ShowGridLines="False" 
            DataContext="{Binding RelativeSource={RelativeSource 
                     FindAncestor, 
                     AncestorType={x:Type local:SimpleListControl}}}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="25"/> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="*"/> 
           </Grid.RowDefinitions> 
           <StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="0"> 
            <ListBox Name="lstLeft" 
               MinHeight="200" 
               ItemsSource="{Binding LeftSideList, RelativeSource={RelativeSource TemplatedParent}}" 
               DisplayMemberPath="{Binding DisplayMemberPath, RelativeSource={RelativeSource TemplatedParent}}" 
               SelectionMode="Extended" 
               IsSynchronizedWithCurrentItem="True" 
               SelectedIndex="0" /> 
           </StackPanel> 
          </Grid> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ResourceDictionary> 


     public class SimpleListControl : Control 
     { 
      static SimpleListControl() 
      { 
       DefaultStyleKeyProperty 
        .OverrideMetadata(typeof(SimpleListControl), 
        new FrameworkPropertyMetadata(typeof(SimpleListControl))); 

       LeftSideListProperty = DependencyProperty.Register("LeftSideList", 
        typeof(IEnumerable), 
        typeof(SimpleListControl), 
        new PropertyMetadata(OnLeftItemsSourceChanged)); 

       DisplayMemberPathProperty = DependencyProperty.Register("DisplayMemberPath", 
        typeof(string), 
        typeof(SimpleListControl), 
        new UIPropertyMetadata(string.Empty)); 
      } 


      public readonly static DependencyProperty LeftSideListProperty; 
      public ObservableCollection<object> LeftSideList 
      { 
       get{return new ObservableCollection<object>{GetValue(LeftSideListProperty)};} 
       set { SetValue(LeftSideListProperty, value); } 
      } 

      public static readonly DependencyProperty DisplayMemberPathProperty; 
      public string DisplayMemberPath 
      { 
       get { return (string)GetValue(DisplayMemberPathProperty); } 
       set { SetValue(DisplayMemberPathProperty, value); } 
      } 

      private static void OnLeftItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
      { 
       //TODO. 
      } 
     } 

CustomerView

<Window x:Class="WpfApp1.Views.CustomersView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:simpleList="clr-namespace:WpfCustomControlLibrary1.SimpleList;assembly=WpfCustomControlLibrary1" 
     xmlns:viewModels="clr-namespace:WpfApp1.ViewModels" 
     Title="CustomersViewq" Height="300" Width="300"> 

    <Window.Resources> 
     <viewModels:CustomersViewModel x:Key="ViewModel" /> 
    </Window.Resources> 
    <Grid> 
     <simpleList:SimpleListControl Name="SimpleListControl1" 
           LeftSideList="{Binding Source={StaticResource ViewModel},Path=AvailableCustomers}" 
           DisplayMemberPath="Surname" Margin="0,24,0,12" /> 
    </Grid> 
</Window> 

CustomersViewModel

public class CustomersViewModel:ViewModelBase 
    { 
    public CustomersViewModel() 
    { 
     availableCustomers = new ObservableCollection<CustomerViewModel>(); 
     availableCustomers.Add(new CustomerViewModel { FirstName = "Jo1", Surname = "Bloggs1" }); 
     availableCustomers.Add(new CustomerViewModel { FirstName = "Jo2", Surname = "Bloggs2" }); 
     availableCustomers.Add(new CustomerViewModel { FirstName = "Jo3", Surname = "Bloggs3" }); 
     availableCustomers.Add(new CustomerViewModel { FirstName = "Jo4", Surname = "Bloggs4" }); 
    } 

    private ObservableCollection<CustomerViewModel> availableCustomers; 

    public ObservableCollection<CustomerViewModel> AvailableCustomers 
    { 
     get { return availableCustomers; } 
     set 
     { 
      if (availableCustomers == value) return; 
      availableCustomers = value; 
      OnPropertyChanged("AvailableCustomers"); 
     } 
    } 
} 

CustomerViewModel

public class CustomerViewModel : ViewModelBase 
{ 
    private string firstName; 

    public string FirstName 
    { 
     get { return firstName; } 
     set 
     { 
      if (firstName == null) return; 
      firstName = value; 
      OnPropertyChanged("FirstName"); 
     } 
    } 

    private string surname; 

    public string Surname 
    { 
     get { return surname; } 
     set 
     { 
      if (surname == null) return; 
      surname = value; 
      OnPropertyChanged("Surname"); 
     } 
    } 
} 

ответ

0

Что бы вы ни пытались достичь, похоже, вы слишком усложняете ситуацию. Однако, если вам нужно отобразить Surname, вам необходимо установить его в DisplayMemberPath как DisplayMemberPath="Surname". Вот учебник по пользовательским элементам управления: How to Create Custom Control.

Ниже приведена ссылка на создание повторно используемого пользователя. Управление пользователями: Creating Re-useable User Controls.

+0

спасибо за ваш ответ. Это была опечатка, это не сработало, установив «Фамилия», что является непонятным. Что касается сложности. Я бы упростил его? Требование состоит в создании wpf customControl, который будет иметь listbox + некоторые кнопки, и этот настраиваемый элемент управления будет ссылаться на другое приложение wpf. – developer9969

+0

Я бы порекомендовал вам пойти с созданием «User Control», если только у вас нет требований, которые не выполняются «User Control». – zulq

+0

Я уже видел эти ссылки, и они не помогли. Я пропустил что-то тривиальное, и я не могу его увидеть. Расскажите, как мне было приказано создавать пользовательские элементы управления, которые будут находиться внутри dll-бит, например, «wpfToolkit», если хотите. У кого-нибудь есть предложения? – developer9969

 Смежные вопросы

  • Нет связанных вопросов^_^