【问题标题】:WPF DataTrigger - Setting ListBoxItem IsSelectedWPF DataTrigger - 设置 ListBoxItem IsSelected
【发布时间】:2010-12-25 17:40:59
【问题描述】:

我的多选列表框中的 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>

【问题讨论】:

  • 在重现您的问题时,我发现如果我在触发器中设置 ListBoxItem IsSelected=True,那么我也可以在触发器中将其设置为 False。但是,一旦用户选择了该项目,触发器将不再更改 IsSelected。
  • 嗯,这很有趣。对我来说找到删除选择的方法并不是一个好兆头。感谢您的调查。

标签: wpf data-binding binding datatrigger


【解决方案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,我还无法验证。

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2010-10-19
    • 2011-02-05
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多