WPF用户控件绑定到集合

本文关键字:集合 绑定 控件 用户 WPF | 更新日期: 2023-09-27 17:55:04

我在我的UI上有一个listBox,在我的视图模型中有一个后备集合。我一直在尝试数据绑定/数据模板,这样,如果一个新的项目被添加到集合中,一个新的用户控件被添加到UI。然而,我不能得到这个工作完全。澄清一下,我可以根据集合中的项目数量在UI上显示正确数量的控件,但是不能将用户控件的属性绑定到集合中的项目。这只是我试图弄清楚它最初,然后使这个更复杂以后,也许很好,我现在有这个问题…

数据绑定WPF代码:

<ListBox x:Name="SubSystemList" ItemsSource="{Binding Path=SubSystems}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type src:SubSystem}">
            <controls:SubSystem DeviceCount="{Binding Path=DeviceCount}" SystemName="{Binding Path=Name}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我试图渲染到的用户控件的属性:

public string SystemName
{
    get { return (string) GetValue(SubSystenNameProperty); }
    set { SetValue(SubSystenNameProperty, value); }
}
public int DeviceCount
{
    get { return (int) GetValue(DeviceCountProperty); }
    set { SetValue(DeviceCountProperty, value); }
}

我不愿意发布更多的代码(直接…),因为它只会变得更加难以理解。设置中的调试WriteLine根本不会触发(断点不会被击中)。这让我觉得这是路径/绑定的问题。

任何帮助都将非常感激。

编辑src:子系统代码:(为了清晰起见,删除了额外的属性)

public class SubSystem
{
    [XmlAttribute("Name")]
    [DataMember]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    [DataMember]
    public int DeviceCount
    {
        get { return _deviceCount; }
        set { _deviceCount = value; } 
    }
}

DependencyProperties on usercontrols:subsystem

public static readonly DependencyProperty DeviceCountProperty = DependencyProperty.Register(
    nameof(DeviceCount), typeof(int), typeof(SubSystem));
public static readonly DependencyProperty SubSystenNameProperty = DependencyProperty.Register(
    nameof(SystemName), typeof(string), typeof(SubSystem));
另一个编辑

进一步在输出日志中揭示了这一点:

em.Windows.Data Error: 40 : BindingExpression path error: 'SystemName' property not found on 'object' ''SubSystem' (HashCode=32985660)'. BindingExpression:Path=SystemName; DataItem='SubSystem' (HashCode=32985660); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')

让我觉得在/bindings后面的用户控件代码中发生了它不喜欢的事情,有趣的是,在我感到困惑之后,我将usercontrol的名称更改为subsystemcontrol,并确保uc中的所有绑定名称都是正确的。所以不确定它为什么要这么做…

WPF用户控件绑定到集合

似乎有你的依赖属性声明错误。

例如,string SystemName依赖属性的完整声明如下:
public static readonly DependencyProperty SystemNameProperty =
    DependencyProperty.Register("SystemName", typeof(string), typeof(SubSystem));
public string SystemName
{
    get { return (string)GetValue(SystemNameProperty); }
    set { SetValue(SystemNameProperty, value); }
}

注意,在属性包装器中除了GetValue/SetValue之外不应该有任何其他内容。如果你需要得到关于属性值变化的通知,你可以通过属性元数据注册一个PropertyChangedCallback,并使用Register方法的另一个重载。

我认为你应该:

  • 在子系统类中实现InotifyPropertyChanged接口

  • DependencyProperties SystemName和DeviceCount的SetValue和GetValue

    公共类子系统:INotifyPropertyChanged{公共事件PropertyChangedEventHandler PropertyChanged;

    [XmlAttribute("Name")]
    [DataMember]
    public string Name
    {
        get { return _name; }
        set { 
            _name = value;
            OnPropertyChanged("Name");
            }
    }
    [DataMember]
    public int DeviceCount
    {
        get { return _deviceCount; }
        set { 
            _deviceCount = value; 
            OnPropertyChanged("DeviceCount");
            } 
    } 
    
    protected void OnPropertyChanged(string name)
    {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
    

    }

在你的SubSystemName属性应该被SystemName代替

[XmlAttribute("SystemName")]
[DataMember]
public string SystemName
{
    get { return _name; }
    set { _name = value; }
}