我知道这个话题已经回答了,但我找不到解决方案的问题。所以这是我的代码:
<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。现在我甚至可以接受下拉菜单中的项目只是禁用它的事实,如果它使事情变得更容易,我只需要一个事实,如果他已经被选中就无法再次选择
答案 0 :(得分:1)
要求:
我们将在组合框的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