繁体   English   中英

WPF UserControl绑定到集合

[英]WPF UserControl Binding to Collection

我的UI上有一个listBox,而我的viewmodel中有一个后备集合。 我一直在尝试对其进行数据绑定/数据模板化,以便如果在集合中添加了新项目,则将新的用户控件添加到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:SubSystem代码:(为清楚起见,删除了其他属性)

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; } 
    }
}

依赖于用户控件的属性:子系统

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')

让我觉得用户控制代码后面/绑定中不喜欢发生什么,有趣的是,在我感到困惑之后,我将用户控件的名称更改为subsystemcontrol,并确保了uc中的所有绑定名称都是正确。 所以不知道为什么要完全这样做..继续进行下去。

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

例如,一个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方法。

我认为您应该:

  • 在SubSystem类中实现InotifyPropertyChanged接口。

  • DependencyProperties SystemName和DeviceCount的SetValue和GetValue

    公共类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)); } 

    }

SubSystem类中, Name属性应替换为SystemName

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM