Связывание 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");
}
}
}
спасибо за ваш ответ. Это была опечатка, это не сработало, установив «Фамилия», что является непонятным. Что касается сложности. Я бы упростил его? Требование состоит в создании wpf customControl, который будет иметь listbox + некоторые кнопки, и этот настраиваемый элемент управления будет ссылаться на другое приложение wpf. – developer9969
Я бы порекомендовал вам пойти с созданием «User Control», если только у вас нет требований, которые не выполняются «User Control». – zulq
Я уже видел эти ссылки, и они не помогли. Я пропустил что-то тривиальное, и я не могу его увидеть. Расскажите, как мне было приказано создавать пользовательские элементы управления, которые будут находиться внутри dll-бит, например, «wpfToolkit», если хотите. У кого-нибудь есть предложения? – developer9969