0

我目前正在使用 ICollectionView myCollectionView 绑定到 ObservableCollection。该集合的内容是从 ComboBox 中选择的。每个集合项 myCollectionItem 都有一个 VisualBrush myVisualBrush 作为子项,并且 CurrentItem 的画笔显示在预览面板中。

集合项也是一个子对象 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>
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 回答