WPF:如何重新创建ItemContainer?(WPF: how to recreate Item

2019-09-29 04:25发布

下面我刚才的问题如何改变ComboBox项的知名度 ,因为这个问题略有改变我决定开一个新的岗位来解决它。 对于那些不想阅读以前的帖子所有评论谁,这里的情况。

我有一个在运行时产生一个DataGrid。 这个数据网格中的每一列具有集管内的组合框。 所有这些组合框具有相同的源代码,这是一类项目的可观察集合。 每一个项目显示,我的组合框的ItemContainerStyle使用属性,来决定每个ComBoBoxItem是否应该是可见或不可见。

现在,据我所知,WPF工作是这样的:如果一个视图包含类似组合框或树形控件,那么他们的项目(即ComboBoxItem,树型视图......),就不会发生,直到它是没有必要的(例如当组合框的下拉被打开)。 如果我申请一个ItemContainerStyle,这将告诉其项目应如何创建的目标。 问题是,在那个产生这个项目的那一刻,每一个变化我需要应用的风格,不会被保存。

这里是我的代码:

    <DataGrid HeadersVisibility="Column" Name="griglia" Grid.Row="2" ItemsSource="{Binding Path=Test}" AutoGenerateColumns="True" IsReadOnly="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Visible">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="ContentTemplate" >
                    <Setter.Value>
                        <DataTemplate DataType="DataGridColumnHeader"  >
                            <ComboBox ItemContainerStyle="{StaticResource SingleSelectionComboBoxItem}" DisplayMemberPath="Oggetto" Width="100" Height="20" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},Path=DataContext.Selezione, UpdateSourceTrigger=LostFocus}"  SelectionChanged="SingleSelectionComboBox_SelectionChanged">
                            </ComboBox>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.ColumnHeaderStyle>
    </DataGrid>

ItemContainerStyle:

     <Style x:Key="SingleSelectionComboBoxItem" TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Selezionato}" Value="True">
                <!-- Hide it -->
                <Setter Property="Visibility" Value="Collapsed" />
                <!-- Also prevent user from selecting it via arrows or mousewheel -->
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

的SelectionChanged:

private void SingleSelectionComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (var item in e.RemovedItems.OfType<PopolazioneCombo>())
        {
            item.Selezionato = false;
        }

        foreach (var item in e.AddedItems.OfType<PopolazioneCombo>())
        {
            item.Selezionato = true;
        }
    }

我的要求是,如果在任意的N组合框的项目被选中的话,该项目不能被任何人选择,直到他失去了的SelectedItem状态。 比如假设我有2个组合框和4项集合(X,Y,A,B)。 如果x在ComboBox1选择,则x不能在没有2组合框的选择,直到ComboBox1变化的SelectedItem(从x到y为实例)。 现在,我甚至可以接受,如果它使事情变得更容易,我只需要它不能再次,如果他已经选择了选择的事实的下拉列表中的项目仅仅是禁用的事实。

问题是,对于具有其ItemContainerGenerator.Status = NotStarted每一个组合框这个解决方案的工作(这意味着ComboBoxItem仍然没有创建)。 如果我打开一个组合框的下拉,那么它的组合框项目将保留自己的风格,无论我做什么(导致ItemContainerGenerator.Status = ContainersGenerated),而我没有打开组合框跟踪的变化的知名度项目。

我在寻找一个解决方案来重新创建这些项目都与在能见度变化的新样式将被应用

Answer 1:

互联网上的幸运研究后(即我已经找到关键字的正确组合),我发现这个奇妙的方法,所以在这里更新的解决方案:

private void ComboBox_DropDownOpened(object sender, EventArgs e)
    {
        ComboBox c = sender as ComboBox;
        c.Items.Refresh();
    }

在XAML中添加此事件,使其成为:

<ComboBox DropDownOpened="ComboBox_DropDownOpened" ItemContainerStyle="{StaticResource SingleSelectionComboBoxItem}" DisplayMemberPath="Oggetto" Width="100" Height="20" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},Path=DataContext.Selezione, UpdateSourceTrigger=LostFocus}"  SelectionChanged="SingleSelectionComboBox_SelectionChanged"/>

和神奇组合框显示正确的改变。 现在,我不是代码的大风扇的后面,所以如果有,或通过XAML的方式来添加这个属性做我的收藏它会更好



文章来源: WPF: how to recreate ItemContainer?