2014-09-02 3 views
1

채팅 프로그램을 만들고 채팅 서버에 연결할 API가 있습니다.자동으로 바인딩 된 WPF ComboBox

여기 API는 기본 클래스입니다.

public partial class PengChat3ClientSock : IDisposable 

잘, 나는 ToString 방법도 역시 무시했다.

public override string ToString() 
    { 
     string s; 

     if (ConnectedIP != null && ConnectedPort != null) 
      s = ConnectedIP + ':' + ConnectedPort.Value.ToString(); 
     else 
      return ""; 

     if (string.IsNullOrEmpty(Nickname)) 
      return s; 
     else 
      return s + " \"" + Nickname + "\""; 
    } 
글쎄, 클라이언트 프로그램에서

소켓

private List<PengChat3ClientSock> socketList = new List<PengChat3ClientSock>(); 

의 목록입니다 그리고 내가

<ComboBox Grid.Row="0" Grid.ColumnSpan="2" Height="20">     
</ComboBox> 

이제 연결 목록을 표시하는 것입니다 콤보 상자를

, 난 ComboBox ItemsSource를 변수 socketList

012와 바인딩하려는 경우

클라이언트가 새 소켓을 만들 때 소켓 목록을 추가/제거하고 socketList로 다시 밀거나 socketList에서 제거하려고합니다.

가능합니까?

감사합니다.

+0

ObsrevableCollection

답변

1

ObservableCollection을 사용해야합니다.

private ObservableCollection<PengChat3ClientSock> socketList = new ObservableCollection<PengChat3ClientSock>(); 

그런 다음) (단지 InitializeComponents 후 생성자에서,

<ComboBox Name="SocketListComboBox" Grid.Row="0" Grid.ColumnSpan="2" Height="20">     
</ComboBox> 

그리고 코드 (xaml.cs)에서 XAML

에서 콤보 상자의 이름; do

SocketListComboBox.ItemsSource = socketList; 

다른 방법은 XAML로 바인딩하는 것입니다.

<ComboBox Name="SocketListComboBox" Grid.Row="0" Grid.ColumnSpan="2" Height="20" ItemsSource = "{Binding socketList}">     
</ComboBox> 

생성자에서 ComboBox DataContext를 socketList의 소유자로 설정합니다. 그리고 socketList는 public get과 함께 속성이어야합니다.

public ObservableCollection<PengChat3ClientSock> socketList {get; protected set; } 
+0

감사합니다. 그것은 내 시스템에서 완벽하게 작동하고 있습니다. – Lee

1

일반 목록 대신 ObservableCollection<PengChang3ClientSock>을 사용하십시오. ObservableCollection은 바인딩 된 컨트롤에 알리기 위해 항목을 컬렉션에 추가하거나 제거 할 때 CollectionChangedEvent를 발생시킵니다.

이 설정은 콤보 상자의 DataContext에 (뷰 모델은) 당신의 ObservableCollection에 캡슐화 속성 소켓을 가지고 있어야

<ComboBox Grid.Row="0" Grid.ColumnSpan="2" Height="20" ItemsSource="{Binding Sockets}">     
</ComboBox> 

같은 콤보 상자의 ItemsSource로 ObservableCollection에 설정합니다.

public ObservableCollection Sockets{ 
    get{ 
    return socketList; 
    } 
} 
+0

감사합니다. 그것은 내 시스템에서 완벽하게 작동하고 있습니다. – Lee

0

예. 가능합니다.

ComboBox Grid.Row="0" Grid.ColumnSpan="2" Height="20" ItemSource="{Binding socketList}>     

당신이해야 할 마지막 일은이를 설정하는 것입니다 : 당신은 다음과 같이 콤보 상자에 바인딩을 추가 ObservableCollection

private ObservableCollection]<PengChat3ClientSock> socketList = new List<PengChat3ClientSock>(); 

에 소켓의 목록을 보유해야 List가있는 클래스의 ComboBox가있는 Window의 DataContext입니다.

DataContext = new ClassWithSocketList(); 

지금부터는 목록에서 수행 할 모든 작업이 목록에 바인딩됩니다.

+0

대단히 감사합니다 :) – Lee

관련 문제