2010-04-19 3 views
1

내 레이블이 목록 상자에서 선택한 값을 표시 할 수 있도록 종속성 속성을 사용하려고합니다. 이것은 단지 의존성 프로퍼티의 작동을보다 명확하게 이해하는 것입니다.종속성 속성 ListBox

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WPFToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    xmlns:local="clr-namespace:WpfApplication1" x:Name="MyWindow" 
    Height="200" Width="300" > 
<StackPanel> 
     <ListBox x:Name="lbColor" Width="248" Height="56" ItemsSource="{Binding TestColor}"/> 

     <StackPanel> 
      <Label Content="{Binding Path=Test, ElementName=lbColor}" /> 
     </StackPanel> 
    </StackPanel> 

</Window> 

코드 뒤에,

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 

     public ObservableCollection<string> TestColor { get; set; } 

     public String Test 
     { 
      get { return (String)GetValue(TestProperty); } 
      set { SetValue(TestProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for Title. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty TestProperty = 
      DependencyProperty.Register("Test", typeof(String), typeof(ListBox), new UIPropertyMetadata("Test1")); 



     public Window1() 
     { 
      InitializeComponent(); 
      TestColor = new ObservableCollection<string>(); 
      DataContext = this; 
      TestColor.Add("Red"); 
      TestColor.Add("Orange"); 
      TestColor.Add("Yellow"); 
      TestColor.Add("Green"); 
      TestColor.Add("Blue"); 
     } 
    } 
} 

는 아무도 내가이 종속성 속성을 사용하여 accompalish 방법을 설명해 수 있습니다. 어떻게 든 저는 Dependency Property 개념과 매우 혼동을 느낍니다. 단지 그것을위한 실제 예제를보고 싶었습니다.

+0

종속성 속성을 사용하여 수행하는 작업은 다음을 참조하십시오. http://stackoverflow.com/questions/1723756/why-dependency-properties/1723831#1723831 –

+0

DP를 보여주는 많은 예제가 있음을 이해합니다. 사용 이유와 관련된 문서를 제공하지만 DP가 어떤 단계에서 수행하는지 이해하게하려면 작동하는 것을보고 싶습니다. 어떻게 호출되는지, 어떤 시점에서 값이 설정되고 어떤 값이 설정되고 무엇입니까? – developer

답변

1
당신은 당신의리스트 박스를해야합니다

는 현재 텍스트를 "선택"

<StackPanel> 
    <!-- Add selected item binding --> 
    <ListBox 
     x:Name="lbColor" Width="248" Height="56" 
     ItemsSource="{Binding TestColor}" 
     SelectedItem="{Binding Test}" 
    /> 

    <StackPanel> 
     <!-- No need for elementname - just use Test on the DataContext --> 
     <Label Content="{Binding Path=Test}" /> 
    </StackPanel> 
</StackPanel> 
+0

위의 코드는 typeof Dependency 속성을 ListBox에서 Window1로 변경 한 후에 작동합니다. 선생님, 기술적으로 정확히 무슨 일이 일어 났는지 설명해 주시겠습니까? 즉, 목록 값을 클릭 한 후 DP 값이 설정됩니까? 그리고 내가 XAML에서 DP를 사용하고 싶을 때마다 DP의 값을 소스로 설정해야합니까? – developer

+0

오, 예 - 그렇게 놓친 것은 그렇게 설정되지 않았습니다. 클래스에 DependencyProperty 유형을 설정해야합니다. 목록에있는 것이 아니라 클래스에 DP를 정의하고 있기 때문입니다. 지금은 목록 상자에서 새 항목을 선택하면 ListBox가 바인딩을 통해 Window1 클래스에 "SelectedItem"값을 설정합니다. 레이블은 DP이기 때문에 레이블의 새 값을 반영하고 자체를 업데이트합니다. –

1

나는 데이터가 빅 브라더로 바인딩 생각하고 싶다. Binding 시스템은 다양한 등록 Binding을 모두 감시하도록 설정하고 적절한 기준 (예 : FocusLost 또는 PropertyChanged)이 발생하면 Binding 시스템은 소스 값을 대상에 복사합니다. TwoWay 또는 OneWayToSource Y 인딩의 경우 Y 인딩 시스템은 올바른 기준이 _ 생하면 목표에서 소스로 복사합니다.

타깃은 DependencyProperty 여야합니다. 다른 값에 의존하는 특별한 속성이기 때문에 대상이되어야합니다. XAML {Binding}은 새로운 BindingExpression을 만들고 바인딩 시스템에 특정 BindingExpression을 등록하는 BindingOperations.SetBinding을 호출하여 업데이트를보고 수행하는 방법을 알고 있습니다.

이점은 대상과 소스가 명시 적으로 다른 코드를 업데이트하는 코드를 작성해야 할 필요가 없다는 것입니다. 색상 목록을 제공하는 방법을 알고있는 코드가있는 경우 색상이 사용자에게 표시되는 방법에 대해 신경을 써야하는 이유는 무엇입니까? 바인딩 시스템이 바인딩을 처리하기 때문에 내 색상을 사용하는 대상이 목록 상자, 트리 뷰 또는 항목 목록을 처리하는 방법을 알고있는 다른 개체인지는 중요하지 않습니다. 내가 신경 써야 할 부분 (내가 공개하는 공용 인터페이스)에 집중할 수 있으며, 다른 인터페이스에 붙이는 지저분한 세부 사항에 신경을 쓸 필요가 없습니다.