2011-02-14 1 views
0

현재 ICollectionView, myCollectionView를 사용하여 ObservableCollection에 바인딩하고 있습니다. 해당 컬렉션의 내용이 ComboBox에서 선택됩니다. 각 컬렉션 항목 인 myCollectionItem은 VisualBrush, myVisualBrush를 자식으로 가지며 CurrentItem의 브러시는 미리보기 패널에 표시됩니다.WPF 현재 항목의 하위에 바인딩되지 않음

컬렉션 항목은 자식 개체 인 myItemChild이며 슬라이더를 생성하는 데 사용되는 여러 가지 자체 속성이 들어 있습니다. 이 슬라이더는 미리보기 패널의 속성을 변경합니다.

예상대로 작동합니다.

Collectionview의 CurrentItem이 변경되면 미리보기 패널이 올바르게 업데이트되지만 슬라이더에 이전 CurrentItem의 myItemChild가 계속 표시됩니다.

myItemChild 변경 사항이 발생하지 않는데이 상황을 어떻게 처리해야합니까?

가능성이 매우 높습니다. 나는 포인터가 너무 좋아서 뭔가를 놓쳤습니다.

감사

<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="Auto"></RowDefinition> 
    <RowDefinition Height="Auto"></RowDefinition> 
    <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 

    <!-- Combo Box for selection of item--> 
    <ComboBox Grid.Row="0" ItemsSource="{Binding myCollectionView, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type vm:myCollectionItem}" > 
     <StackPanel> 
      <Rectangle Height="40" Width="40" Fill="{Binding myVisualBrush}"/> 
     </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    </ComboBox> 

    <!-- Panel to preview item--> 
    <ContentControl Grid.Row="1" Content="{Binding myCollectionView/}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate DataType="{x:Type vm:myCollectionItem}" > 
     <Rectangle Margin="20" Fill="{Binding myVisualBrush}" /> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
    </ContentControl> 

    <!-- Slider to edit item--> 
    <ContentControl Grid.Row="2" Content="{Binding myCollectionView/}"> 
    <ContentControl.ContentTemplate> 

     <DataTemplate DataType="{x:Type vm:myCollectionItem}" > 
     <ContentControl Content="{Binding myItemChild}"> 
      <ContentControl.ContentTemplate> 

      <DataTemplate DataType="{x:Type vm:myCollectionItemChild}" > 
       <StackPanel> 
       <Label Content="{Binding myValueLabel, Mode=OneWay}"/> 
       <Slider Value="{Binding myValue, Mode=TwoWay}" Maximum="{Binding myValueMax}" Minimum="{Binding myValueMin}"/> 
       </StackPanel> 
      </DataTemplate> 

      </ContentControl.ContentTemplate> 
     </ContentControl> 
     </DataTemplate> 

    </ContentControl.ContentTemplate> 
    </ContentControl> 
</Grid> 
+0

기사 왜 바인딩에 슬래시를 사용합니까? 이 코드를 제거하고 Content = "{Binding myItemChild}"로 작성하십시오. 코드를 단순화 할 때 오타였던 – vorrtex

+0

@vorrtex. CurrentItem을 나타 내기 위해 myCollectionView에 있었어야합니다. 나는 그 질문을 편집했다. 감사합니다 – rjw

답변

0

나는 당신의 문제를 재현하려하지만, 문제없이 작동합니다.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var items = new ObservableCollection<myCollectionItem>{ 
      new myCollectionItem(Brushes.Red, new myCollectionItemChild("Red", 15, 0, 80)), 
      new myCollectionItem(Brushes.Green, new myCollectionItemChild("Green", 0.7, 0, 1)), 
      new myCollectionItem(Brushes.Purple, new myCollectionItemChild("Purple", 22,11,33))}; 
     this.DataContext = new Model { myCollectionView = items }; 
    } 


} 

public class Model 
{ 
    public ObservableCollection<myCollectionItem> myCollectionView { get; set; } 
} 

public class myCollectionItem 
{ 
    public myCollectionItem(Brush br, myCollectionItemChild child) 
    { 
     this.myVisualBrush = br; 
     this.myItemChild = child; 
    } 
    public Brush myVisualBrush { get; set; } 
    public myCollectionItemChild myItemChild { get; set; } 
} 

public class myCollectionItemChild 
{ 
    public myCollectionItemChild(string label, double val, double min, double max) 
    { 
     this.myValueLabel = label; 
     this.myValue = val; 
     this.myValueMin = min; 
     this.myValueMax = max; 
    } 
    public string myValueLabel { get; set; } 
    public double myValue { get; set; } 
    public double myValueMax { get; set; } 
    public double myValueMin { get; set; } 
} 

는 또한, 당신이 컨트롤 템플릿을 사용할 필요가 없습니다 : 다음은 내 코드 숨김입니다. 다음과 같이 더 명확하게 쓸 수 있습니다 :

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="80"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 

    <!-- Combo Box for selection of item--> 
    <ComboBox Grid.Row="0" ItemsSource="{Binding myCollectionView, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate DataType="{x:Type vm:myCollectionItem}" > 
       <StackPanel> 
        <Rectangle Height="40" Width="40" Fill="{Binding myVisualBrush}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

    <!-- Panel to preview item--> 
    <Rectangle Margin="20" Fill="{Binding myCollectionView/myVisualBrush}" Grid.Row="1" /> 

    <!-- Slider to edit item--> 
    <StackPanel Grid.Row="2" DataContext="{Binding myCollectionView/myItemChild}"> 
     <Label Content="{Binding myValueLabel, Mode=OneWay}"/> 
     <Slider Value="{Binding myValue, Mode=TwoWay}" Maximum="{Binding myValueMax}" Minimum="{Binding myValueMin}"/> 
    </StackPanel> 
</Grid> 
+0

고마워요. 이것이 문제가되지 않았기 때문에 나는 내 얼굴에 알을 썼지 만, 나는 더 명백한 것들을 보지 못했던 구속력이있는 문제라고 자신있게 확신했다. 아주 완벽한 대답을 주셔서 감사합니다. 제 xaml을 정리할 수있었습니다. 건배. – rjw