0

現在、ICollectionView、myCollectionViewを使用してObservableCollectionにバインドしています。そのコレクションのコンテンツは、ComboBoxから選択されています。各コレクションアイテムmyCollectionItemには、子としてVisualBrush、myVisualBrushがあり、CurrentItemのブラシがプレビューパネルに表示されます。

コレクションアイテムは子オブジェクトmyItemChildでもあり、スライダーの生成に使用される独自のプロパティがいくつか含まれています。このスライダーは、プレビューパネルのプロパティを変更します。

これはすべて期待どおりに機能します。

コレクションビューの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>
4

1 に答える 1

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>
于 2011-02-14T22:07:41.673 に答える