0

Window에 ObservableCollection의 "Layouts"및 "SelectedLocation"DependencyProperty가 있습니다. SelectedLocation에는 "이름"등과 같은 필드를 포함하는 객체 인 "Layout"이라는 속성이 있습니다. 나는 SelectedLayout에 콤보 상자를 바인딩하려고하는데 작동하지 않습니다. 다음은 작동하지 않습니다. 대신 SelectedItem에 대한 바인딩을 시도해 보았습니다. 나는이에서 INotifyPropertyChanged를 구현 않지만 내가합니다 (SelectedLocation하는 DependencyProperty의 하위 속성에 바인딩하고있어 사실과 함께 할 수있는 뭔가가있을 수 있습니다 생각합니다. 그러나 WPF : Nested DependencyProperties

<ComboBox Grid.Row="2" Grid.Column="0" x:Name="cboLayout" ItemsSource="{Binding Layouts,ElementName=root}" SelectedValue="{Binding SelectedLocation.Layout.LayoutID,ElementName=root}" DisplayMemberPath="{Binding Name}" SelectedValuePath="LayoutID" /> 

, 또한 "SelectedLocation"에 바인딩 다음 작품 (DP :?. IEnumerable<Layout> 그러나 당신이 당신을 콤보 상자 Layout 객체를 포함 할 때, 상황을 가지고 그래서 Layout.LayoutID에 선택된 값을 결합하고, :. 부동산 Layouts가이 유형 나는이 같은 것을 가정 무엇

<TextBox Grid.Row="4" Grid.Column="1" x:Name="txtName" Text="{Binding SelectedLocation.Name,ElementName=root,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
+0

1) 게시물 제목에 태그를 넣지 마십시오. 2) 구속력있는 오류를 찾으십시오. 아마 당신은 무슨 일이 일어나고 있는지에 대한 단서를 제공 할 것입니다. Visual Studio의 디버그 출력 창에서 찾을 수 있습니다. 또 다른 해결책은 우수한 Snoop을 사용하여 응용 프로그램의 시각적 트리를 두드려 바인딩 오류를 찾는 것입니다. –

답변

1

Int 식별자로 선택하십시오. 물론 바인딩 엔진은 Int을 찾을 수 없습니다.

코드의 세부 사항에 대해서는 잘 모릅니다. 제안 할 수있는 한 가지 : 바인딩 표현식을 줄이려고합니다 (SelectedItem="{Binding SelectedLocation.Layout,ElementName=root}).

성공하지 못하면 진행 상황을 이해하는 데 도움이되는 코드를 추가로 제공하십시오.

==== 업데이트 ==== 내가 말했듯

, 당신은 분명히 뭔가 잘못을 다하고 있습니다. 그러나 나는 초자연적 인 사람이 아니므로 실패한 이유를 추측 할 수 없습니다 (코드없이). 코드를 공유하고 싶지 않다면 모든 것을 작동시키는 간단한 예제를 제공하기로 결정했습니다. 아래에 표시된 코드를 살펴보고 응용 프로그램에서 다른 점을 알려주십시오. 속성 레이아웃 중첩 된

public class Layout 
{ 
    public Layout(string id) 
    { 
     this.LayoutId = id; 
    } 

    public string LayoutId 
    { 
     get; 
     private set; 
    } 

    public override string ToString() 
    { 
     return string.Format("layout #{0}", this.LayoutId); 
    } 
} 

클래스 SelectionLocation : 속성 LayoutId를 노출

클래스 레이아웃 종속성 속성 (실제로, 내 예에 StartupView가있는 UserControl이지만,와

public class SelectedLocation : INotifyPropertyChanged 
{ 
    private Layout _layout; 

    public Layout Layout 
    { 
     get 
     { 
      return this._layout; 
     } 
     set 
     { 
      this._layout = value; 
      this.OnPropertyChanged("Layout"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string name) 
    { 
     var safeEvent = this.PropertyChanged; 
     if (safeEvent != null) 
     { 
      safeEvent(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

그리고 윈도우 클래스 그것은 중요하지 않습니다) :

StartupView의 XAML :

<UserControl x:Class="Test.StartupView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:self="clr-namespace:HandyCopy" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Name="Root"> 
    <WrapPanel> 
     <ComboBox ItemsSource="{Binding Path=Layouts,ElementName=Root}" 
        SelectedItem="{Binding Path=SelectedLocation.Layout, ElementName=Root}"/> 
    </WrapPanel> 
</UserControl> 
+0

나는 그것을 시도했다. LayoutID는 고유 ID 인 문자열 등록 정보입니다. "레이아웃"속성은 "레이아웃"개체의 ObservableCollection이며 각 개체는 "LayoutID"속성을가집니다. – Echilon

+0

신경 쓰지 마라. 당신은 명백한 실수를했습니다 : 항목이 Layout 일 때 문자열로 값을 선택할 수 없습니다. 또 다른 하나의 낯설음은 SelectedItem 대신 SelectedValue를 사용하고 있습니다. 마지막 하나를 시도하고 알려주세요. –

+0

SelectedValue 및 SelectedItem, SelectedValuePath 함께 및 사용하지 시도했지만 아무것도 작동하는 것. – Echilon