使用绑定对象在列表框中正确使用数据绑定

时间:2012-08-27 16:25:18

标签: c# .net silverlight data-binding silverlight-5.0

您好,并提前感谢您的帮助。我在使用数据绑定时遇到一个问题,该数据绑定具有我希望在列表框中显示的属性的对象列表。

我的Silverlight子窗口中有一个列表框,其xaml如下所示:

<StackPanel Orientation="Vertical" Width="235">
                        <sdk:Label Content="Servers" HorizontalAlignment="Center"></sdk:Label>
                        <!--new group servers list box-->
                        <ListBox x:Name="NewGroupServersLB" Height="150" Width="200" ItemsSource="{Binding}" SelectionChanged="NewGroupServersLB_SelectionChanged" >
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=ServerName}"></TextBlock>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </StackPanel>

我正在使用带有以下代码的Binding对象实例在后面的代码中设置其DataContext:

/*create new binding source object */
 Binding serversBinding = new Binding();
 /*set data source */
 serversBinding.Source = childServersList;
 /*set the data source for the new group servers listbox*/
 NewGroupServersLB.DataContext = serversBinding;

我可以看到使用调试Binding对象的源有两个成员,并且它们是我的childServersList中的相应服务器对象实例。但是,当我运行它时,列表框中没有任何内容。但是,当我将列表框的datacontext直接设置到后面代码中的服务器列表时,服务器名称将显示在列表框中。你能告诉我为什么会这样或者我做错了吗?我尝试使用Binding对象的原因是因为我想从第一个列表框中填充另一个包含所选服务器对象的子成员的列表框。提前感谢您的帮助,我为这个问题的冗长而道歉。

如果它有用,我存储在列表中的服务器对象如下所示:

[XmlRoot("Server")]
public class RegisterServerObject
{
    public RegisterServerObject() { }

    [XmlElement("ServerID")]
    [Browsable(false)]//not displayed in grids
    [EditorBrowsable(EditorBrowsableState.Never)]//not displayed by intellisense
    public string ServerIDString
    {
        set
        {
            ServerID = Convert.ToInt32(value);//convert the value passed in by xml to your type
        }
        get
        {
            return Convert.ToString(ServerID);
        }
    }

    [XmlIgnore]
    public int ServerID { get; set; }

    [XmlElement("GroupID")]
    public string GroupIDString
    {
        get
        {
            return this.GroupID.ToString();
        }
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                this.GroupID = 0;
            }
            else
            {
                this.GroupID = int.Parse(value);
            }
        }
    }

    [XmlIgnore]
    public int GroupID { get; set; }

    [XmlElement("ParentID")]
    public int ParentID { get; set; }

    [XmlElement("ServerName")]
    public string ServerName { get; set; }

    [XmlElement("User")]
    public string User { get; set; }

    [XmlElement("UID")]
    public int Uid { get; set; }

    [XmlElement("PWD")]
    public string Domain { get; set; }

    [XmlElement("Location")]
    public string Location { get; set; }

    [XmlArray(ElementName = "AssociatedModules")]
    [XmlArrayItem(ElementName = "Module")]
    public List<RegisterModuleObject> AssociatedModules { get; set; }

1 个答案:

答案 0 :(得分:1)

有几种不同的方法可以指定绑定源(与数据绑定的对象)。第一种是指定DataContext。这可以在XAML中或通过代码完成。

NewGroupServersLB.DataContext = childServersList;

请注意,DataContext设置为源对象。

如果您使用的是Binding对象,则应将Binding对象的Source设置为绑定源。

MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);

在这种情况下,您正在设置Binding对象,然后将其应用于控件。 DataContext未设置,但如果是,则会被忽略,因为Binding对象优先。

对于您的特定示例,您可能需要阅读数据绑定文档的这一特定部分:

http://msdn.microsoft.com/en-us/library/ms752347.aspx#master_detail_scenario