1

我的多选 ListBox 中的 ListBoxItems 上有以下数据触发器

<DataTrigger Value="True">
    <DataTrigger.Binding>
        <MultiBinding Converter="{StaticResource DisableWorkItemConverter}">
            <Binding ElementName="MainForm" Path="PickedWorkItemID"/>
            <Binding Path="Id"/>
        </MultiBinding>
    </DataTrigger.Binding>
    <Setter Property="IsEnabled" Value="False"/>
    <Setter Property="IsSelected" Value="False"/>
</DataTrigger>

IsEnabled 设置得很好,但 IsSelected 没有设置。我该如何解决?

我尝试取出 IsEnabled 以查看它是否与 IsSelected 冲突,但该项目在不应该被选中时仍保持选中状态。

重申一下,我可以告诉绑定和转换器工作正常,因为 IsEnabled 工作正常。但由于某种原因 IsSelected 不会取消设置。


编辑:我突然想到我可能不希望它像 IsEnabled 那样工作。因为当此触发器评估为 false 时,该项目将重新启用。我不希望仅仅因为此触发器不再正确而选择以前未选择的行。

有任何想法吗?基本上我不希望选择任何禁用的行。


编辑2:

我尝试添加一个普通触发器,希望它会链接数据触发器,但这也不起作用。

<Style.Triggers>
    <DataTrigger Value="True">
        <DataTrigger.Binding>
            <MultiBinding Converter="{StaticResource DisableWorkItemConverter}">
                <Binding ElementName="MainForm" Path="PickedWorkItemID"/>
                <Binding Path="Id"/>
            </MultiBinding>
        </DataTrigger.Binding>
        <Setter Property="IsEnabled" Value="False"/>
    </DataTrigger>
    <Trigger Property="IsEnabled" Value="False">
        <Setter Property="IsSelected" Value="False"></Setter>
    </Trigger>
</Style.Triggers>
4

1 回答 1

1

似乎一旦设置了“IsSelected”属性,无论是由用户还是在后面的代码中,setter 都将不再工作。我不确定是否有任何解决方法,但至少有一个 hack 可以在您的特定情况下工作。您可以在 ListBoxItem 上为“IsEnabledChanged”事件注册一个处理程序,然后检查您的数据条件并在数据需要时在处理程序中设置 IsSelected。

例子:

private void ListBoxItem_EnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    ListBoxItem senderItem = (ListBoxItem)sender;
    if (YourDataCondition == true)
    {
        senderItem.IsSelected = false;
    }
}

我能找到的唯一其他解决方案是将一些依赖项属性添加到您的 ListBoxItem,向其“OnPropertyChanged”事件注册一个类似的方法,然后在 DataTrigger 中更改该属性。

这是其他人的尝试,我还无法验证。

于 2009-12-11T18:13:17.830 回答