2016-07-04 19 views
0

私は自分のUI上にlistBoxを持ち、viewmodelにバッキングコレクションを持っています。 新しいアイテムがコレクションに追加された場合、新しいユーザーコントロールがUIに追加されるようにdatabind/datatemplateしようとしています。しかし、私はこれを完全に動作させることはできません。 明確にするために、コレクション内の項目数に対してUIに表示するコントロールの数を正しく設定できますが、ユーザーコントロールのプロパティをコレクション内の項目にバインドすることはできません。 これは、私だけは、私は今、この問題を持っていることを、おそらく良い、その後に、これは非常に、より複雑にするために、最初はそれを理解しようとしています。..WPF UserControlコレクションへのバインド

データバインドWPFコード:UserControlから

<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は起動しません(ブレークポイントはヒットしません)。私はそれをパス/バインディングの問題と考えています。

ご協力いただければ幸いです。

EDIT 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:サブシステム

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

は私が考えさせる

はそれが好きdoesntの背後にあるユーザーコントロールのコードで何が起こって何か/バインディングを、theresの面白いことですが、私は混乱した後、私はsubsystemcontrolに、ユーザーコントロールの名前を変更uc内のすべてのバインディング名が正しいことを確認しました。なぜこのことを全面的にやっているのかは分かりません。

+2

に置き換えしかし、DeviceCountとのSystemNameたDependencyPropertyはありますかする必要がありますかそれらをUIにバインドする場合は、Dependecy Propertiesとして定義する必要があります。 msdn:https://msdn.microsoft.com/en-us/library/ms752914(v=vs.100).aspx – CiccioRocca

+0

コントロールを参照してください.SubSystemは、SystemNameとDeviceCountを変更できるようにする必要があります。その後、UIから変更する必要があります。値を変更することなく、セッターでヒットすることはありません。修正してチェックしていますか? – CarbineCoder

+0

@ciccioroccaプロパティは間違いなくDependencyPropertiesです。これは私の最初の頭のスクラッチャーでした。 –

答えて

0

あなたの依存関係プロパティの宣言が間違っていると思われます。

例として、string SystemName依存関係プロパティの完全な宣言は次のようになります。プロパティラッパーで、その後、何GetValueメソッド/値の代入があってはならないことを

public static readonly DependencyProperty SystemNameProperty = 
    DependencyProperty.Register("SystemName", typeof(string), typeof(SubSystem)); 

public string SystemName 
{ 
    get { return (string)GetValue(SystemNameProperty); } 
    set { SetValue(SystemNameProperty, value); } 
} 

注意。プロパティ値の変更についての通知を受け取る必要がある場合は、Registerメソッドの別のオーバーロードを使用してプロパティメタデータを使用してPropertyChangedCallbackを登録できます。

+0

私はこれが一つの問題だと思っています。しかし、バインディングの問題を修正したわけではありません。ユーザーコントロールに値を渡すことはできません。しかし、このおかげで、私はそれが異なるゲッター/セッターが必要だと分かっていませんでした。 –

0

私は、あなたがすべきことだと思う:

  • あなたのサブシステムクラスにINotifyPropertyChangedのインターフェイスを実装します。

  • 値の代入及びDependencyPropertiesのSystemNameのGetValueメソッドとDeviceCount

    パブリッククラスサブシステム: {公開イベントPropertyChangedEventHandlerにPropertyChangedをINotifyPropertyChangedの。あなたのSubSystemクラスNameプロパティで

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

    }

+0

私はSubSystemで今すぐINotifyPropertyChangedを実装しましたが、関係するコールを入れましたが、運がない、まだバインドされていません。ユーザーコントロールがUIのデータバインディングから値を取得していません。それはそのUIのコントロールの右の数を置くようにイライラ。ちょうどデータがありません。 –

+0

バインディングエラーはありますか? – CiccioRocca

+0

いいえ、まったくデータがありません...私が得るのは、DependencyPropertiesのデフォルトデータです。 –

0

SystemName

[XmlAttribute("SystemName")] 
[DataMember] 
public string SystemName 
{ 
    get { return _name; } 
    set { _name = value; } 
} 
関連する問題