![](/img/trans.png)
[英]getting null from property binded for selected wpf combobox value
[英]ComboBox binded to a List of UserControls not showing selected value
我在項目中創建了如下定義的userControl節點:
<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和端口,您可以從中獲取一些數據。
我創建了一個組合框,供用戶用來選擇要從中收集數據的源節點。 我使用數據綁定來獲取當前可用節點列表。
sourcesBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding() { Source = MainUI.mainWindow.sources});
sourcesBox.DisplayMemberPath = "NameString";
sourcesBox.SelectedValuePath = "NameString";
其中MainUI.mainWindow.Sources
是public ObservableCollection<Node> sources;
我還將把我的部分Node類的實現留給你
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();
}
ComboBox正確顯示當前可用的所有可能節點,但是如果我選擇某些內容,則不會顯示SelectedValue。
我該如何解決這個問題?
您應該能夠通過使用SelectedValue屬性將所選數據對象綁定到ComboBox(我相信SelectedItem屬性是只讀的)。 如果必須在代碼中設置此綁定,則可以通過以下方式完成:
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.