WPF DataTrigger - 设置ListBoxItem IsSelected

时间:2009-12-11 16:14:01

标签: wpf data-binding binding datatrigger

我在Multi-selection 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>

1 个答案:

答案 0 :(得分:1)

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

示例:

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

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

以下是someone else's attempt to do this我尚未验证的内容。