2013-04-25 73 views
1

我有兩個ComboBox我的代碼之後:數據綁定組合框的的InitializeComponent()

<ComboBox Name="comboBoxSelectCamera" ItemsSource="{Binding Path=ListCameras}" SelectionChanged="comboBoxSelectCamera_SelectionChanged" /> 
<ComboBox Name="comboBoxCities" ItemsSource="{Binding Path=ListCities}" />  

在我Window我有這樣的代碼,以便ComboBox明白的地方的Path來自:

<Window .... 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    .... > 

這兩個組合綁定到我在我的MainWindow上創建的兩個利斯特:

public MainWindow() 
{ 
    InitializeCitiesCombo(); 

    InitializeComponent(); 

    // Initialize the control that checks for cameras 
    InitializeCameraControl(); 
    FillCameraProperties(); 
    DataContext = this; 
} 

第一個ComboBox列表創建的之前InitializeComponent,所以當它的組合創建時,它會填充特定的內容。

第二ComboBox列表中創建的InitializeComponent,因爲它取決於加載攝像頭的對象,並且,我不知道如果是這樣的原因,但如果InitializeComponent後創建名單,它不填寫ComboBox

我知道有其他的方法來填補我的計算機上的連接攝像機列表,但爲使用在InitializeComponent中創建並在InitializeCameraControl()發起的控制。

任何想法如何填補這ComboBoxInitializeComponent

編輯:聲明兩個列表:

private List<CameraInfo> ListCameras { get; set; } 
private List<String> ListCities { get; set; } 

某處在代碼中,ListCites

ListCities = new List<String> { Madrid, Barcelona, Alicante, Valencia } 

某處在代碼中,我控制返回的連接的攝像機列表(它的工作原理,它有元素但它們不顯示在組合上):

ListCameras = MyUserControl.ConnectedCameras; // this returns a valid list of `CameraInfo` 

CameraInfo類:

public class CameraInfo 
{ 
    public CameraInfo(string name, string id); 

    public static implicit operator string(CameraInfo cameraInfo); 

    public string Id { get; } 
    public string Name { get; } 

    public override string ToString(); 
} 

請注意,當我們討論這個,我試圖改變攝像機的DisplayMemberPath組合。

綁定錯誤:

System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=Text; DataItem='MainWindow' (Name=''); target element is 'TextBox' (Name=''); target property is 'Template' (type 'ControlTemplate') 
+0

你在攝像機列表中使用了什麼類?它只是列表或ObservableCollection ? – Blablablaster 2013-04-25 08:25:50

+0

向我們展示這兩個列表的聲明。他們不是'ObservableCollections',對吧? – DHN 2013-04-25 08:26:02

+0

他們應該是什麼樣的名單?請注意,在'InitializeComponent'之前創建的那個是正確的,但另一個不是。 – Sonhja 2013-04-25 08:29:44

回答

2

好了,有你的主要問題。首先,像這樣改變你的列表。

private ObservableCollection<CameraInfo> _listCamera; 
public ObservableCollection<CameraInfo> ListCameras 
{ 
    get { return _listCamera ?? (_listCamera = new ObservableCollection<CameraInfo>()); } 
} 

我只顯示它的一個列表,但你必須爲兩者做。要填寫清單,請勿重新實例化,但要清除它們。例如。

private void FillCameraInfo() 
{ 
    IEnumerable<CameraInfo> example = new[] { new CameraInfo(), new CameraInfo() }; 
    ListCameras.Clear(); 
    foreach(var exampleEntry in example) 
     ListCameras.Add(exampleEntry); 
} 

這只是一個例子,所以我儘量保持簡單。如果你想重新實現它們,綁定就會被「摧毀」。

第一個ComboBox填寫正確的地方在於,在您使用它們的綁定初始化組件之前,您正在填充它。所以這些項目可以找到。第二個ComboBox不知道ListCities中的更改,因爲它沒有通知它。如果您使用ObservableCollection<T>ComboBox將被通知,請看看here欲知更多信息。綁定應該按預期工作。

編輯 - 爲什麼你不應該重新實例集合

如果你會做以下,以將數據放入收集

public FillCameraInfo() 
{ 
    ListCameras = new ObservableCollection<CameraInfo>(someData); 
} 

綁定還是會聽「老」實例。但是您更改了參考號ListCameras,並且沒有人收聽新實例。

編輯 - 爲什麼你沒有看到任何

好吧,這是一個有點古怪,但它像它。綁定ComboBox的聲明順序非常重要,因此它可以正常工作。請看看here的正確順序。

+0

它仍然沒有填充任何東西... :(((( – Sonhja 2013-04-25 08:45:56

+0

)你能解釋一下你說什麼,當你說'如果你會重新實現它們,綁定將被破壞' – Sonhja 2013-04-25 08:47:11

+0

@Sonhja Oo - 這只是一個例子,你可以使用任何你想要的東西,我只是想演示你應該如何填充數據集合,沒有更多... – DHN 2013-04-25 08:47:16