2016-07-25 21 views
0

in einem benutzerdefinierten Steuerelement einen Auswahlbox Bindungeine Auswahlbox in einem benutzerdefinierten Steuerelement Bindung .Cannot Binde es

Ich baue eine individuelle Steuerung, die ein listbox inside.I hier geschrieben haben hat die vereinfachte Version

I kann anscheinend keine Eigenschaft meines gebundenen viewModel anzeigen. "Nachname".

Können Sie sehen, was ich falsch mache?

generic.xaml (innen Custom)

 <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. 
      } 
     } 

Customer

<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"); 
     } 
    } 
} 

Antwort

0

Was auch immer Sie erreichen wollen, es scheint, dass Sie die Dinge komplizierter machen. Wenn Sie jedoch Surname anzeigen müssen, müssen Sie es im DisplayMemberPath als DisplayMemberPath="Surname" einstellen. Hier ist ein Tutorial für benutzerdefinierte Steuerelemente: How to Create Custom Control.

Unten ist ein Link zum Erstellen von wiederverwendbaren Benutzersteuerelement: Creating Re-useable User Controls.

+0

danke für Ihre Antwort. Das war ein Tippfehler, es funktioniert nicht, indem Sie "Nachname" das ist, was ist verwirrend. In Bezug auf die Komplexität. Ich würde es dir vereinfachen? Die Anforderung besteht darin, ein wpf-customControl zu erstellen, das über Listbox und einige Schaltflächen verfügt. Auf dieses benutzerdefinierte Steuerelement wird von verschiedenen wpf-Anwendungen verwiesen. – developer9969

+0

Ich würde empfehlen, gehen Sie mit der Erstellung eines 'User Control' statt, es sei denn, Sie haben Anforderungen von' User Control' nicht erfüllt. – zulq

+0

Ich habe bereits diese Links gesehen und sie haben nicht geholfen. Ich vermisse etwas Triviales und ich kann es nicht sehen. Ich wurde aufgefordert, ein customcontrols zu erstellen, das innerhalb eines DLL-Stücks wie dem "wpfToolkit" sein wird, wenn Sie mögen. Irgendwelche Vorschläge? – developer9969