我的UI上有一个listBox,我的viewmodel中有一个后台集合。 我一直在尝试数据绑定/ datatemplate它,以便如果在集合中添加新项目,则会向UI添加新的用户控件。但是,我无法完全开始工作。 为了澄清,我可以在UI上显示正确数量的控件以显示集合中的项目数,但是无法将用户控件的属性绑定到集合中的项目。 这只是我最初试图弄清楚,然后让这个变得更加复杂,或许好我现在有这个问题..
DataBinding 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>
我尝试渲染的usercontrol的属性:
public string SystemName
{
get { return (string) GetValue(SubSystenNameProperty); }
set { SetValue(SubSystenNameProperty, value); }
}
public int DeviceCount
{
get { return (int) GetValue(DeviceCountProperty); }
set { SetValue(DeviceCountProperty, value); }
}
我不愿意发布更多代码(直接......),因为它只会变得更难以遵循。 setter中的Debug 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; }
}
}
usercontrols上的DependencyProperties: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')
让我觉得在它不喜欢的用户控件代码/绑定中发生了一些事情,有趣的是,在我感到困惑之后,我将usercontrol的名称更改为subsystemcontrol,并确保所有绑定名称都在这是非常正确的。所以不确定为什么它完全这样做..进一步深入研究。
答案 0 :(得分:0)
你似乎让你的依赖属性声明错误。
例如,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
方法的另一个重载。
答案 1 :(得分:0)
我认为你应该:
在SubSystem类中实现InotifyPropertyChanged接口。
DependencyProperties SystemName和DeviceCount的SetValue和GetValue
public class SubSystem: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));
}
}
答案 2 :(得分:0)
在Name
班级中,SystemName
属性应替换为[XmlAttribute("SystemName")]
[DataMember]
public string SystemName
{
get { return _name; }
set { _name = value; }
}
this.state = {
companies: [
{logo_url: require("../../../img/company_logos/ald.png")},
{logo_url: require("../../../img/company_logos/arval.png")},
{logo_url: require("../../../img/company_logos/businesslease.png")},
{logo_url: require("../../../img/company_logos/dieterenusedcars.png")},
{logo_url: require("../../../img/company_logos/psa.png")},
{logo_url: require("../../../img/company_logos/remarketing_center.png")},
{logo_url: require("../../../img/company_logos/vdfin.png")}
]
}