2016-07-04 5 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); } 
} 

: 난으로 렌더링하기 위해 노력하고있다. Setters의 Debug WriteLine이 전혀 실행되지 않습니다 (중단 점에 도달하지 않음). 어느 것이 나를 경로/바인딩 문제라고 생각하게합니다.

도움을 주시면 감사하겠습니다.

편집 SRC : 하위 시스템 코드 : (명확성을 위해 제거 추가 속성) 된 UserControls에

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

나를 생각하게

는 같은 나던 뒤에 사용자 제어 코드에서 일어나는 일/바인딩을, 프로그래머 재미있는 일이, 내가 혼란스러워지고 후, 나는 subsystemcontrol하는 UserControl을 이름을 변경 , 그리고 uc의 바인딩 이름이 모두 올바른지 확인했습니다. 그래서 왜이 일이 전적으로 .. 왜 계속 나아가고 있는지 확실하지 않습니다.

+2

그러나로되어 교체해야? 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/SetValue는이되어서는 안된다는

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

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

참고. 속성 값 변경에 대한 알림을 받아야하는 경우 속성 메타 데이터를 통해 PropertyChangedCallbackRegister 메서드의 또 다른 오버로드로 등록 할 수 있습니다.

+0

이것이 하나의 문제라고 생각합니다. 그러나 바인딩 문제를 해결하지는 못했지만 사용자 컨트롤에 값을 가져올 수 없습니다. 이것에 감사드립니다, 나는 그것이 다른 getter/setter가 필요하다는 것을 깨닫지 못했습니다. –

0

은 당신이해야한다고 생각 :

  • 이 하위 시스템 클래스에서 INotifyPropertyChanged 인터페이스를 구현합니다.

  • SetValue를하고 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

은 DeviceCount 및 SystemName에 DependencyProperty에, SystemName

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