2010-05-06 2 views
0

현재 WPF에서 사용자 지정 컨트롤을 만드는 방법을 배우고 있습니다. 레이블 및 텍스트 상자를 사용하여 간단한 사용자 지정 컨트롤을 만들었습니다. DependencyProperty에 의해 Label 텍스트를 설정할 수있었습니다.ComboBoxItem을 사용자 정의 컨트롤 (XAML/WPF)의 콤보 상자에 추가

이제 ComboBox가있는 사용자 정의 컨트롤을 만듭니다. 컨트롤 외부에서이 ComboBox에 항목을 추가 할 수 있어야합니다.

이 작업을 수행하기 위해 ItemsCollection 유형의 DependencyProperty를 노출하고 ComboBox의 Items 속성에 액세스 할 수있게되었습니다 (내 컨트롤 샘플의 DP 이름은 'CbItems'임). 그러나 Combobox의 Items 속성이 ReadOnly이기 때문에 오류가 발생합니다.

제어 XAML

<UserControl x:Class="MyWpfApp.Controls.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="Auto" Width="Auto"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Column="0" Content="{Binding FieldLabel}"></Label>  
     <ComboBox Name="cmb" Grid.Column="1" Width="150"></ComboBox> 
    </Grid> 
</UserControl> 

MainWindow를 XAML 내가 올바른 방법이 기능을 달성하기 위해 무엇인지 알고 싶습니다

<Window x:Class="MyWpfApp.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ctl="clr-namespace:MyWpfApp.Controls" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ctl:MyControl> 
      <ctl:MyControl.CbItems> 
       <ComboBoxItem>Hello</ComboBoxItem> 
       <ComboBoxItem>World</ComboBoxItem> 
       <ComboBoxItem>Hi</ComboBoxItem> 
      </ctl:LobCombox.CbItems> 
     </ctl:LobCombox> 
    </Grid> 
</Window> 

. 나는이에 대한 답도 모든 당신이 필요한 정보, 그리고 당신이 할 수있는 모든 옵션의 철저한 설명을 포함 박사 WPF에서의 GridView 등 같은 다른 컨트롤

많은 감사

답변

2

This great article 도움이 될 생각 활용하라.

+0

링크를 제공해 주셔서 감사합니다. 나는 CollectionViewSource를 사용하여 문제를 해결했다. – byte

2

WPF는 일반적으로 바인딩을 통해 많은 것을 달성합니다. 익숙해지는 패러다임 전환입니다.

Window1.xaml

<Window 
x:Class="ComboBoxSpike.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" 
Height="300" 
Width="300"> 
<StackPanel> 
    <ComboBox 
     ItemsSource="{Binding ComboBoxItems}" /> 
    <Button 
     x:Name="AddToComboBox" 
     Content="Add an item to combo box" 
     Click="AddToComboBox_Click" /> 
</StackPanel> 
</Window> 

이 Window1.xaml.cs

public partial class Window1 : Window 
{ 
    private ViewModel _viewModel; 
    public static int Counter; 

    public Window1() 
    { 
     InitializeComponent(); 
     _viewModel = new ViewModel(); 
     this.DataContext = _viewModel; 
    } 

    private void AddToComboBox_Click(object sender, RoutedEventArgs e) 
    { 
     _viewModel.ComboBoxItems.Add("ComboBoxItem" + Counter); 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     this.ComboBoxItems = new ObservableCollection<string>(); 
    } 

    public ObservableCollection<string> ComboBoxItems { get; set; } 


    } 

아이디어가 당신의 콤보 상자의 항목이 결합하는 것을 : 여기에 몇 가지 작업 코드의 간단한 예입니다 문자열의 컬렉션 (또는 그 문제에 대한 개체, 당신은 datatemplates와 함께 apperance을 변경할 수 있습니다). ComboBox 자체는 변경하지 않고 바인딩 된 항목의 컬렉션을 변경합니다.

+0

MVVM 관점에서 David에게 감사드립니다. 나는 Charlie가 언급 한 기사에서 CollectionViewSource를 사용하여 내 문제를 해결했으며 CollectionViewSource 사용법에 대한 몇 가지 다른 온라인 정보를 제공했다. 나는 네 대답을 upvoted. – byte

관련 문제