2011-02-03 3 views
3

texbox가 포함 된 itemtemplate을 사용하여 목록 상자와 두 개의 분리 된 바인딩 문제가 있습니다.목록 상자 itemtemplate 문제 내에서 바인딩

1) 하나의 목록 상자가 문자열 목록에 바인딩됩니다. 작성된 텍스트 상자 안에 각 문자열을 표시하고 양방향 바인딩을 동시에 허용 할 수 있습니까? 경로 또는 XPath를 지정하지 않으면 양방향 바인딩이 허용되지 않습니다.

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" Name="listBoxKeys" VerticalAlignment="Top" Width="219" ItemsSource="{Binding Path=SelectedPlatform.Keys}" SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
        <TextBox Text="{Binding Mode=OneWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
</ListBox> 

그리고 2) 사용자 지정 KeyValuePair 클래스의 일반 목록에 바인딩하는 다른 목록 상자를 사용합니다. itemtemplate에는 텍스트 상자와 콤보 상자가 있습니다. 텍스트 상자 텍스트는 각 KeyValuePair 객체의 key 속성에 바인딩되고 combobox는 selecteditem을 value 속성에 바인딩합니다. 내 문제는 런타임에 변경 될 내 viewmodel에 선언 된 문자열 목록에 의해 콤보를 채우고 싶습니다. 윈도우의 datacontext는리스트가 선언 된 뷰 모델이다. 콤보 박스 항목 소스를 바인딩 할 때 사용해야하는 정확한 구문을 모르겠습니다. 여기에 내 코드입니다 :

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
      <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
      <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding ?}" SelectedItem="{Binding Value, Mode=TwoWay}"/> 
     </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+1

이 당신이 어떤 사람들은 그래서 당신은 두 사람이 제대로 답변을 얻을 수 있습니다 하나가 아닌 다른 대답 할 수 찾을거야 진짜로 두 개의 질문이 있었다한다. 이것은 대답을 정확하게 표시하기 어렵게 만듭니다. –

답변

4

문제는 데이터 템플릿이 생성되는 모든 객체 (문자열), 때 교체해야한다는 것을 의미하기 때문 소스에 바인딩 양방향 자체가 작동하지 않을 수 있다는 것입니다 사용자가 텍스트 상자의 텍스트를 변경합니다. 분명히, 이것은 작동하지 않을 것이다. 양방향 바인딩은 바인딩 된 객체의 쓰기 가능한 속성에서만 작동합니다. 귀하의 경우에는

나는 목록 상자에서 항목 (당신의 문자열에 대한 기본적 뷰 모델)에 대한 뷰 모델을 생성하고 데이터 템플릿에에에 Value 속성을 노출하고 바인딩 제안 :

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" 
     Name="listBoxKeys" VerticalAlignment="Top" Width="219" 
     ItemsSource="{Binding Path=SelectedPlatform.KeyViewModels}" 
     SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
        <TextBox Text="{Binding Value, Mode=TwoWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        </StackPanel> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+0

고마워. Name이라는 문자열 속성이있는 ControllerKey라는 불필요한 클래스를 만들었습니다. 그래서 지금 SelectedPlatform.Keys는 문자열 대신 ControllerKey 유형의 일반적인 목록입니다. 그 방법은 내 문제를 극복 :) – muku

2

1) 파블로 Glazkov이이 콤보 지금 오히려 뷰 모델보다 키 값 쌍 것에 대해 아래의 DataContext에 나를

2)에 좋은 대답을 갖고있는 것 같아요. 이 작업을 수행하는 다른 방법이있을 수 있지만 이전에 사용한 적이있는 바인딩 RelativeSource 소스를 다시 부모 ItemsControl에 설정하는 것입니다. 같은

RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}} 

뭔가 :

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
      <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
      <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding DataContext.Keys, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SelectedItem="{Binding Value, Mode=TwoWay}"/> 
     </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+0

그래서 코드는 목록 상자의 항목을 찾고 있습니다. 그러나 그것은 내가 필요한 것이 아닙니다. 목록 상자의 ItemsSource가 SelectedPlayer.ControlProfile에 바인딩 된 것을 보면 ... SelectedPlayer는 내 viewmodel의 속성입니다. 뷰 모델에 Keys라는 또 다른 속성이 있습니다. 그것이 내가 콤보 상자의 ItemsSource를 묶고 싶은 곳이다. – muku

+0

@muku - 내 나쁜 ... 퍼즐의 한 부분을 놓치고 있었다. 샘플 최신 업데이트를 확인하십시오. DataContext.Keys 경로를 변경했습니다. –

+0

안녕하세요 감사합니다 :) 그 일했습니다. 키 목록이 업데이트 된 후 콤보 상자의 항목을 업데이트하기 위해 수행해야 할 작업에 대한 좋은 자습서를 가르쳐 주시겠습니까? 더 많은 예제를 묻는 데 어려움을 겪지 않으려 고합니다. 좋은 자습서를 살펴볼 수 있습니다. (나는 wpf의 초보자입니다.) – muku