WPF
응용 프로그램에서 작업 중이며 최근에는 재사용이 가능하도록 User Controls
을 만들었습니다.여러 상자 형식의 컬렉션에 대해 다시 사용할 수 있도록 UserControl의 콤보 상자 ItemsSource를 일반화합니다.
나는 두 개의 User Controls
InputUC
과 ComboBoxUC
을 가지고 있습니다. 둘 다 Label
이 TextBox
이고 Label
이 ComboBox
입니다. 필요한 종속성 속성을 정의하여 InputUC
을 성공적으로 구현했습니다.
제가 직면 한 문제는 ComboBoxUC
입니다. 내 응용 프로그램에서 Cities
, Customers
, Salesmen
및 다른 위치에있는 다른 엔티티를 표시해야하는 시나리오가 있습니다. 분명히 각 엔티티는 DisplayMemberPath
, SelectedValuePath
, SelectedValue
속성 및 ItemsSource
속성이 ComboBox
인 다른 유형의 Collection
에 다른 속성 이름을 제공합니다.
인터넷에서 검색 한 적이 있지만 동일한 해결책을 찾지 못했습니다.
내가 노력하고 코드는 내가이 UserControl
을 사용하고 ComboBoxUC.xaml.cs
public string ComboBoxLabel
{
get { return (string)GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
public bool ComboBoxIsRequired
{
get { return (bool)GetValue(IsRequiredProperty); }
set { SetValue(IsRequiredProperty, value); }
}
public long ComboBoxValue
{
get { return (long)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public bool ComboBoxIsEnabled
{
get { return (bool)GetValue(ValueEnabledProperty); }
set { SetValue(ValueEnabledProperty, value); }
}
public ObservableCollection<CityViewModel> ComboBoxItems
{
get { return (ObservableCollection<CityViewModel>)GetValue(ValueItems); }
set { SetValue(ValueItems, value); }
}
public string ComboBoxDisplayMemberPath
{
get { return GetValue(ValueDisplayMemberPath).ToString(); }
set { SetValue(ValueDisplayMemberPath, value); }
}
public string ComboBoxSelectedValuePath
{
get { return GetValue(ValueSelectedValuePath).ToString(); }
set { SetValue(ValueSelectedValuePath, value); }
}
public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("ComboBoxLabel", typeof(string),
typeof(ComboBoxUC), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty IsRequiredProperty = DependencyProperty.Register("ComboBoxIsRequired", typeof(bool),
typeof(ComboBoxUC), new PropertyMetadata(false));
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("ComboBoxValue", typeof(long),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
public static readonly DependencyProperty ValueEnabledProperty = DependencyProperty.Register("ComboBoxIsEnabled", typeof(bool),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = false, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
public static readonly DependencyProperty ValueItems = DependencyProperty.Register("ComboBoxItems", typeof(ObservableCollection<CityViewModel>),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = false, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
public static readonly DependencyProperty ValueDisplayMemberPath = DependencyProperty.Register("ComboBoxDisplayMemberPath", typeof(string),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = false, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
public static readonly DependencyProperty ValueSelectedValuePath = DependencyProperty.Register("ComboBoxSelectedValuePath", typeof(string),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
public ComboBoxUC()
{
InitializeComponent();
}
Page
제어에서 코드 ComboBoxUC
의 뒤에
ComboBox
제어
<ComboBox Name="valuesComboBox"
Grid.Column="1"
ItemsSource="{Binding ComboBoxItems}"
DisplayMemberPath="{Binding ComboBoxDisplayMemberPath}"
SelectedValuePath="{Binding ComboBoxSelectedValuePath}"
SelectedValue="{Binding ComboBoxValue}"
IsEnabled="{Binding ComboBoxIsEnabled}"
Style="{StaticResource ComboBox-Base}">
</ComboBox>
ComboBoxUC.xaml
의 코드입니다
<local:ComboBoxUC ComboBoxLabel="City"
ComboBoxIsRequired="True"
ComboBoxValue="{Binding CustomerViewModel.customer_city_id}"
ComboBoxItems="{Binding Cities}"
ComboBoxDisplayMemberPath="city_name"
ComboBoxSelectedValuePath="city_id"
ComboBoxIsEnabled="{Binding Flags.AddOrUpdate}">
</local:ComboBoxUC>
이제 응용 프로그램의 여러 곳에서 xaml
과 동일하게 사용할 것입니다. 각각의 경우에 다를 수 있습니다 일들은 다음과 같습니다
- 는
- 도시
- CITY_NAME
- 내가 제대로
ComboBoxUC.xaml
의DataContext
현재 코드를 설정 한
을 CITY_ID CustomerViewModel.customer_city_id 내 UserControl
에 대해 Collection (CityViewModel)
의 한 유형에 대해 올바르게 작동합니다. CustomerViewModel
, SalesmanViewModel
등의 다른 엔티티에 동일한 코드를 사용하고 분명히 다른 속성 이름을 사용하고 싶습니다.
나는 다음 코드를 일반화하고 싶습니다.
public ObservableCollection<CityViewModel> ComboBoxItems
{
get { return (ObservableCollection<CityViewModel>)GetValue(ValueItems); }
set { SetValue(ValueItems, value); }
}
public static readonly DependencyProperty ValueItems = DependencyProperty.Register("ComboBoxItems", typeof(ObservableCollection<CityViewModel>),
typeof(ComboBoxUC), new FrameworkPropertyMetadata { BindsTwoWayByDefault = false, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
나뿐만 아니라 object
유형의 Collection
을 시도했지만 물론 object
유형 내 기관에서 가지고있는 특성이 없습니다.
나는이 지점에서 개발로 전진 할 수 없으므로 도움이 될 것입니다.
내 관심사는 DisplayMemberPath 속성뿐입니다. SelectedValuePath 및 SelectedValue 속성을 사용해야합니다. 그리고 각 속성에 대해 DataTemplate을 정의 할 수는 없습니다. 사용자 정의 컨트롤을 추가하는 동안이 긴 Item 템플릿을 내 Window/Page Xaml에 제공해야한다면이 사용자 컨트롤을 분리 할 수 있습니다. –
DataTemplates (제어 템플릿을 결정해야 함)는 리소스 사전에서 중앙에서 정의 할 수 있으므로 한 번 정의하면되므로 다음과 같이 사용할 수 있습니다. –
ibebbs
예제를 제공해 줄 수 있습니까? –