WPF UserControl绑定到集合

时间:2016-07-04 12:30:42

标签: c# wpf xaml data-binding

我的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,并确保所有绑定名称都在这是非常正确的。所以不确定为什么它完全这样做..进一步深入研究。

3 个答案:

答案 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")}
   ]
}