WPF:如何更改我的ComboBox项的可见性?

时间:2017-06-12 14:50:50

标签: c# wpf combobox binding datatemplate

我知道这个话题已经回答了,但我找不到解决方案的问题。所以这是我的代码:

<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 SelectedValue="{Binding Selezione}" SelectedValuePath="Selezionato" Width="100" Height="20" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},Path=DataContext.Selezione}"  SelectionChanged="Test_SelectionChanged">
                                <ComboBox.ItemTemplate>
                                    <DataTemplate >
                                        <TextBlock Text="{Binding Path=Oggetto}"/>
                                    </DataTemplate>
                                </ComboBox.ItemTemplate>
                            </ComboBox>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.ColumnHeaderStyle>
    </DataGrid>

简而言之,我有一个绑定到数据表的自定义数据网格。每列的标题是一个组合框,其来源是此类的可观察集合:

public class PopolazioneCombo 
{
    public string Oggetto { get; set; }
    private bool selezionato = false;
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propName));
        }
    }
    public bool Selezionato
    {
        get { return !selezionato; }
        set
        {
            if(selezionato != value)
            {
                selezionato = value;
                OnPropertyChanged("Selezionato");
            }
        }
    }
}

我的问题如下:我需要将所有组合框中每个所选项目的可见性切换为折叠(因为它们共享相同的源)。我试图创建一个自定义SelectionChanged事件,在其中我更改“Selezionato”值,我绑定了文本块的可见性,如下所示:

<TextBlock Text="{Binding Path=Oggetto}" Visibility="{Binding Path=Selezionato, Converter={StaticResource BoolToVis}, UpdateSourceTrigger=PropertyChanged}"/>

这样做的问题在于,它不仅使我的SelectedItem在组合框中不可见,而且ComoBoxItem也不同步,因此它根本无法正常工作。

编辑:这是集合

 public ObservableCollection<PopolazioneCombo> Selezione
    {
        get
        {
            return selezione;
        }
        set
        {
            if (selezione != value)
            {
                selezione = value;
                OnPropertyChanged("Selezione");
            }
        }
    }

编辑2:我的要求是,如果在N个组合框中的任何一个中选择了一个项目,那么任何人都无法选择该项目,直到他失去了SelectedItem状态。例如,假设我有2个组合框和4个项目(x,y,a,b)的集合。如果在ComboBox1中选择了x,则在ComboBox1的SelectedItem发生更改(例如从x到y)之前,不能在2个ComboBox中选择x。现在我甚至可以接受下拉菜单中的项目只是禁用它的事实,如果它使事情变得更容易,我只需要一个事实,如果他已经被选中就无法再次选择

1 个答案:

答案 0 :(得分:1)

要求:

  1. 多个组合框都显示相同的选项集。
  2. 如果在组合框中选择了某个项目,则可能未在任何其他组合框中选择该项目。
  3. 我们将在组合框的ItemContainerStyle上使用触发器进行隐藏和禁用,由组合框项的bool Selezionato属性驱动。我们也希望在样式中将Selezionato设置为Binding,但我发现有时我不想要它取消选择项目,所以我在{{{}} { {1}}处理程序。

    ComboBox.SelectionChanged

    组合框。我遗漏了你的一些属性。我添加到您的代码中的重要因素是<Style x:Key="SingleSelectionComboBoxItem" TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}" > <!-- This unselects sometimes when you don't want it to. --> <!-- <Setter Property="IsSelected" Value="{Binding Selezionato, Mode=OneWayToSource}" /> --> <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> ItemContainerStyle

    SelectionChanged

    代码背后:

    <ComboBox
        ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Selezione}" 
        DisplayMemberPath="Oggetto"
        ItemContainerStyle="{StaticResource SingleSelectionComboBoxItem}"
        SelectionChanged="SingleSelectionComboBox_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; } } getter返回PopolazioneCombo.Selezionato - 可能是一个错字,但如果不是,那就是个坏主意!

    !selezionato