2016-08-02 14 views
0

사용 가능한 COM 포트 목록을 표시하는 양식의 콤보 상자가 있습니다. 내가 코드에 댓글을 달았으로동적 콤보 상자에서 콤보 상자 항목의 텍스트 스타일을 변경하십시오.

가 [XAML]

<Window x:Class="test1.MainWindow" x:Name="cbtest1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="200" Width="200"> 
    <Grid> 
     <StackPanel Margin="40"> 
      <ComboBox x:Name="com_ports" ItemsSource="{Binding PortsList}"/> 
     </StackPanel> 
    </Grid> 
</Window> 

그리고 이제

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace test1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      var ports = new List<string>(System.IO.Ports.SerialPort.GetPortNames()); 
      var cb = new ObservableCollection<ComboBoxItem>(); 
      foreach (var x in ports) 
      { 
       cb.Add(new ComboBoxItem { Content = x }); 
       var p = new System.IO.Ports.SerialPort(x); 
       if (p.IsOpen) 
       { 
        // Bold that item in the combobox 
       } 
      } 
      PortsList = cb; 
      this.DataContext = this; 
      InitializeComponent(); 
     } 
     public ObservableCollection<ComboBoxItem> PortsList { get; set; } 
    } 
} 

뒤에 코드가, 나는 콤보 상자 오픈을 표시 할 : 여기에 내가 쓴 코드는 포트는 이며 굵게는입니다. 나는 무엇을해야할지 모른다. 나는 SO와 구글에서 잠시 동안 수색했지만 운이 없었다. 누군가가 나에게 이것을 설명해 주시면 감사하겠습니다. WPF/C# noob.

+0

당신은 ISOPEN 같은 사실 때문에, ComboBoxItem 모델에서 일부 속성을 설정할 수 있습니다. 그리고 xaml 스타일에서 ** [datatrigger] (https://msdn.microsoft.com/en-us/library/system.windows.datatrigger (v = vs.110) .aspx) **를 사용하여 모양을 변경하십시오. – 3615

+0

@ 3615 멍청한 놈으로, 나는 정말로 대답에 감사한다. 나는 잠시 동안 인터넷 검색을 해왔으며, 이제 모든 고통으로부터 나를 구할 수있는 것을 구걸한다. –

답변

3

가장 쉬운 변화가 디스플레이 템플릿을 재정 의하여 당신이 요소에 변경 사항을 적용 WPF에서

 foreach (var x in ports) 
     { 
      var addMe = new ComboBoxItem { Content = x }; 
      cb.Add(addMe); 
      var p = new System.IO.Ports.SerialPort(x); 
      if (p.IsOpen) 
      { 
       addMe.FontWeight = FontWeights.Bold; 
      } 
     } 
+0

좋고 매끄러운. –

+0

긍정적 인 피드백에 감사드립니다. 물론 이것은 ViewModel 없이도 가능합니다 (DataContext없이 Binding 없이도 작동하지만 ComBoxItem을 com_ports 콤보 Items 속성에 직접 추가 할 수 있습니다.) 다음 단계는 MVVM을 적용하여보다 복잡한 솔루션으로 진행하는 것입니다. . 잠시 후 다시 감사합니다 –

1

이 될 것입니다.

좋은 startingpoint

는 여기이 작은 튜토리얼 이해하기 :이 방법은 가지 복잡한 것 같다, link

주의 사항뿐만 아니라 매우 유연하고이를 사용하여 다양한 작업을 수행 할 수 있습니다.

임 비주얼 스튜디오없이이 글을 쓰는, 그래서 몇 가지 구문 오류가있을 수 특정 예를 들어

당신은 쉽게 일부 속성에 바인딩 할 수 있도록 나는 다음과 같은 모델 클래스를 사용합니다 :

public class MyPortModel : INotifyPropertyChanged 
{ 
    private string _displayName; 
    private bool _isOpen; 

    public string DisplayName 
    { 
     get { return _displayName; } 
     set 
     { 
      _displayName = value; 
      OnPropertyChanged("DisplayName"); 
     } 
    } 

    public bool IsOpen 
    { 
     get { return _isOpen; } 
     set 
     { 
      _isOpen = value; 
      OnPropertyChanged("IsOpen"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

코드를 다음으로 변경하십시오.

public MainWindow() 
{ 
    var ports = new List<string>(System.IO.Ports.SerialPort.GetPortNames()); 
    var cb = new ObservableCollection<MyPortModel>(); 
    foreach (var x in ports) 
    { 
     var p = new System.IO.Ports.SerialPort(x); 
     cb.Add(new MyPortModel { DisplayName = x,IsOpen = p.IsOpen}); 
    } 
    PortsList = cb; 
    this.DataContext = this; 
    InitializeComponent(); 
} 
public ObservableCollection<MyPortModel> PortsList { get; set; } 

이 템플릿을 사용하여 항목을 표시하십시오. s :

컨버터를 사용하면 항목을 굵게 표시할지 또는 보통 표시할지 결정할 수 있습니다. 을 heres 컨버터에 대한 코드 :

public class IsOpenBoldConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      return ((bool) value) ? FontWeights.Bold : FontWeights.Normal; 
     } 
     return FontWeights.Normal; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

대단히 고마워요. 이것은 일반적인 방법입니다.하지만 개인적으로 나는 더 짧은 해결책을 선호합니다. –

관련 문제