2016-06-16 166 views
0

我已經在我的項目創造了這樣定義的用戶控件的節點列表:組合框綁定到用戶控件不顯示選定值

<UserControl x:Class="ProjectCrow.Node" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:ProjectCrow" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<Border Name="border" BorderBrush="Black" BorderThickness="1"> 

    <DockPanel LastChildFill="True" Background="AliceBlue" Height="45" Canvas.Top="90" Width="160" MouseRightButtonDown="OnNodeDeselect" MouseLeftButtonDown="OnNodeClick" > 

     <Border BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Left"> 
      <Image Name="img" /> 
     </Border> 


     <Border BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Bottom" Height="10" > 
      <TextBlock Name="protocol" VerticalAlignment="Center" Background="Gold"  TextAlignment="Center" TextWrapping="Wrap"> FFI 
      </TextBlock> 
     </Border> 


     <Border BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Top"> 
      <TextBlock Name="nodeName" VerticalAlignment="Center"  TextAlignment="Center" TextWrapping="Wrap">UNIT 
      </TextBlock> 
     </Border> 

    </DockPanel> 
</Border> 

我用了很多次,在我的應用程序。基本上它表示一個節點,具有一個定義的IP和端口,您可以從中獲取一些數據。

我創建了一個組合框,供用戶用來選擇從哪個源節點收集數據。我使用數據綁定來獲取當前可用節點的列表。

​​

MainUI.mainWindow.Sourcespublic ObservableCollection<Node> sources;

我會離開你也是我的部分節點類的實現

public partial class Node : UserControl 
{ 

    bool selected = false; 

    string name; 

    public string NameString 
    { 
     get { return name; } 

     set { if (name != value) 
      { 
       name = value; 
       NotifyPropertyChanged("NameString"); 
      } 
     } 
    } 


    public virtual event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void NotifyPropertyChanged(params string[] propertyNames) 
    { 
     if (PropertyChanged != null) 
     { 
      foreach (string propertyName in propertyNames) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      PropertyChanged(this, new PropertyChangedEventArgs("HasError")); 
     } 
    } 


    public Node() 
    { 
     InitializeComponent(); 
    } 

組合框顯示正確所有目前可用的可能的節點,但如果我選擇了某些未被顯示的SelectedValue。

我該如何解決這個問題?

+0

你試過'SelectedItem.Value' –

+0

這可能是相關的: http://stackoverflow.com/a/2883923/4846465 –

+1

不要將ComboBox綁定到UserControl的集合。而是將其綁定到數據項列表(即具有相關屬性的類),並將UserControl放置在ComboBox的ItemTemplate中。 ItemTemplate內部將UserControl的屬性綁定到項目屬性。從這裏開始閱讀:[數據模板概述](https://msdn.microsoft.com/en-us/library/ms742521(v = vs.100).aspx)。 – Clemens

回答

0

您應該能夠通過使用SelectedValue屬性(SelectedItem屬性是隻讀的,我相信)將選定的數據對象綁定到ComboBox。

ComboBox Box = new ComboBox(); 
Binding b = new Binding() 
{ 
    Source = YourViewModel, 
    Path = new PropertyPath("YourViewModelProperty"), 
    Mode = BindingMode.TwoWay 
}; 
Box.SetBinding(ComboBox.SelectedValueProperty, b); 

或者在XAML(我的首選方法):如果這種結合必須在代碼中設置,它可以像做

<ComboBox SelectedValue="{Binding YourViewModelProperty, Mode=TwoWay}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <!--Your UserControl goes here--> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox>