簡體   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