2011-10-12 3 views
1

사용 가능한 시스템 색상 목록을 표시하는 콤보 상자가 있습니다. 콤보 상자의 각 항목에는 미리보기 사각형과 텍스트 색 이름이 있습니다. 주어진 시간에 나는 한 번에 화면에 콤보 상자가 6 개나 필요할 수 있습니다. 오버 헤드를 줄이기 위해 모든 콤보 상자에서 재사용 할 정적 항목 목록을 만들었습니다. 그것은 작동하지만, 빨리,하지만 지금은 내가 글꼴 속성을 굵게 설정과 같은 다른 콤보 상자의 속성을 변경하면 모든 콤보 상자에 영향을 단지 하나의 속성을 적용합니다.ItemsSource 바인딩을 사용하는 ComboBox가 다른 속성에 영향을줍니다.

내 코드는 모두 코드 뒤에 있습니다.

내가 다시리스트의 선언과 콤보 상자 :

static private List<ListViewItem> _colorItems = null; 
    ComboBox _comboBoxColorList; 

그럼 내 제어를위한 생성자에서 나는리스트의 초기 생성을위한 코드가 콤보 상자가 포함되어

 if (_colorItems == null) 
     { 
      _colorItems = new List<ListViewItem>(); 

      PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public); 
      Dictionary<String, Color> colorDictionary = colorProperties.ToDictionary(p => p.Name, p => (Color)p.GetValue(null, null)); 
      ListViewItem newItem; 
      foreach (KeyValuePair<String, Color> keyPair in colorDictionary) 
      { 
       newItem = CreateListViewItem(keyPair.Key, keyPair.Value); 
       _colorItems.Add(newItem); 
      } 
     } 
을 그런 다음

 _comboBoxColorList = new ComboBox(); 
     _comboBoxColorList.Height = Constants.ListViewPropertyComboBoxHeight; 
     _comboBoxColorList.VerticalContentAlignment = VerticalAlignment.Center; 
     _comboBoxColorList.Background = Brushes.White; 
     _comboBoxColorList.ItemsSource = _colorItems; 
     _comboBoxColorList.SelectionChanged += new SelectionChangedEventHandler(comboBoxColorList_SelectionChanged); 
     Children.Add(_comboBoxColorList); 

내가 가진 이벤트 핸들러에 나중에 하나

는 그럼 난 콤보 상자를 만들 _colorItems 것을 정적 everythings가 정상적으로 작동되지 않도록 내가 한 경우

  _comboBoxColorList.FontWeight = FontWeights.Bold; 

하지만 느린 :이 코드는 굵게 콤보 상자를 설정합니다. _colorItems가 정적 인 경우 매우 빠르지 만 위의 행은 항목 소스를 굵게 표시하는 모든 콤보 상자를 만듭니다.

어떤 통찰력이나 지혜가 좋을 것입니다.

+0

태그는 제목에 속하지 않으므로 그대로 두십시오. –

+0

두 번째 콤보 상자를 만드는 코드를 게시하십시오. 이벤트 처리기와 전체 이벤트 처리기를 연결하는 방법을 게시하십시오. – Paparazzi

답변

1

,이 프레임 워크 수행 할 수 있습니다. 실제로 XAML에서 수행 할 수 있고해야하는 코드로 많이 작업합니다.

하면 간단하게하려면

사용자가 만든 새로운 클래스와 함께 ObservableCollection 만들기, 이름 등 모든 속성, 실제 색상을 추가 어쩌면 ColorInfo를 호출합니다. 모든 색으로이 목록을 작성하십시오. 원하는만큼 자주 다시 사용할 수 있습니다.

class ColorInfo 
{ 
    public Color Color{get;set;} 
    public string Name{get;set;} 
} 

ObservableCollection<ColorInfo> myColors; 

지금, 당신은 당신의 ComboBoxItemsSource로이 목록을 설정합니다. 마지막으로 항목 템플릿을 제공하고 각 항목이 어떻게 나타나야 하는지를 지정합니다.

<ComboBox x:Name="_comboBoxColorList"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <DockPanel> 
      <Rectangle DockPanel.Dock="Left" Width="16" Height="16"> 
       <Rectangle.Fill> 
        <SolidColorBrush Color="{Binding Color}"/> 
       </Rectangle.Fill> 
      </Rectangle> 
       <TextBlock Fill="{Binding Name}"/> 
      </DockPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

물론 템플릿을 추출하여 StaticResource를 통해 참조 할 수 있습니다.

+0

나는 귀하의 접근 방식을 시도하기 위해 업데이트 작업을하고 있습니다. 내가 가지고있는 소프트웨어는 매우 동적이며 화면에 표시되는 것은 구성 파일을 통해 읽혀지는 내용을 기반으로합니다. 이것이 내가 보통 WPF에 대한 확실한 이해를 아직 가지고 있지 않다는 사실과 그 뒤에있는 코드에서 모든 것을 항상하는 이유입니다. 템플릿을 추출하고 정적 리소스를 통해 참조하는 것은 무엇을 의미합니까? 이 콤보 상자를 만들 때 cs 파일과 함께 xaml 파일이 없습니다. 따라서 사용자가 정의한 항목 템플리트를 어디에 둘 것인지 알 수 없습니다. App.xaml에서 정의하고 참조 할 수 있습니까? 그렇다면 어떻게? – WPFNewbie

+0

물론 그렇게 할 수 있습니다. 사실 제가 의미하는 것입니다. :) App.xaml에 Datatemplate을두기 만하면'x : Key = "colorComboBoxTemplate"와 같은 키를주고,'System.Windows.Application.Current.FindResource ("colorComboBoxTemplate")'를 사용하여 코드를 DataTemplate으로 캐스팅하는 것을 잊지 마십시오. 또한 실제로 "매우 역동적 인 소프트웨어"라고 말하면 WPF의 장점입니다. ObservableCollection은 업데이트 될 수 있으며 코드의 내용을 표시하는 모든 컨트롤은 추가 코드없이 자동으로 업데이트됩니다. – dowhilefor

+0

감사합니다. 그래서 구현했지만 아직 완전히 작동하지 않습니다. 내 목록에 모든 색상 이름이 포함되어 있지만 색상 미리보기 부분이 표시되지 않습니다. 직사각형의 채우기를 하드 코딩 된 색상으로 변경하면 해당 색상이 표시되고, 그렇지 않으면 사각형이 비워집니다. 색상과 이름의 속성 이름을 모두 변경하여 문제가 아니며 차이를 만들지 않았는지 확인했습니다. BTW, TextBlock을 Text 속성을 사용하도록 변경했습니다. – WPFNewbie

0

ListViewItems이 프레임 워크의 프레임이라면 그렇게해서는 안됩니다. 컨트롤간에 공유되는 목록이있는 경우 UI 요소가 아닌 데이터 만 포함해야합니다. 데이터를 특정 방식으로 표시해야하는 경우 ItemTemplate 및/또는 ItemContainerStyle을 사용하십시오.

은 참조 : Styling and Templating

(그냥 설정 ItemsSource이 방법에 의해 구속력없는 ...) 대신 직접 ListBoxItems을 만드는

관련 문제