簡體   English   中英

組合框綁定到不顯示所選值的UserControl列表

[英]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.Sourcespublic 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM