从组合下拉菜单中选择的值不反映

本文关键字:选择 组合 下拉菜单 | 更新日期: 2023-09-27 17:54:19

我有基于WPF组合的下拉列表,最多可以有4个项目。其中最后一项名为"Other"(硬编码),允许用户选择新资源。当用户选择新资源时,它将在下拉列表中更新(仍然有4个项目),并相应地基于所选资源更新UI应用程序中的项目。它还在UI中显示所选项目。我面临的问题可以这样描述:

假设在下拉列表中有以下资源:

Item 1
Item 2
Item 3
Other

现在当我选择'Other'时,会显示一个对话框来选择资源。从这个对话框中,我再次选择"Item1"(下拉列表中的第一项)。现在在UI中,它仍然将选中的项目显示为'Other'。我调查发现根本原因是:在XAML中,下拉控件的项源被绑定到一个名为"ResourceList"的可观察集合。每当在UI中选择一个新资源时,它就会被添加到这个集合中,每当我对这个集合进行"更改"时,它才会反映在UI中,否则就不会。

XAML代码:

<inputToolkit:UxDropDown x:Name="cmbResourceList"
                         MaxWidth="150"
                         Margin="8 0"
                         HorizontalAlignment="Left"
                         AutomationProperties.AutomationId="cmbResourceListForTask"
                         Cursor="Hand"
                         FontSize="{StaticResource TaskListHeaderFontSize}"
                         FontWeight="Bold"
                         ItemsSource="{Binding ResourceList}"
                         SelectedValue="{Binding Path=SelectedResource,
                                                Mode=TwoWay,
                                                UpdateSourceTrigger=PropertyChanged}"

                         ToolTip="{Binding Path=SelectedResource.DisplayName,
                                           Mode=OneWay}"
                         Visibility="{Binding Path=ShowResourceList,
                                              Converter={StaticResource boolToVisibility}}">
    <inputToolkit:UxDropDown.ItemTemplate>
        <DataTemplate>
            <TextBlock AutomationProperties.AutomationId="SelectedResourceItemForTask"
                       Cursor="Hand"
                       Text="{Binding DisplayName}"
                       TextTrimming="CharacterEllipsis" />
        </DataTemplate>
    </inputToolkit:UxDropDown.ItemTemplate>
</inputToolkit:UxDropDown>

在这个绑定中,'SelectedValue'被绑定到视图模型中的'SelectedResource'属性。在属性'SelectedResource'中,每当它假设一个新值时,我们都会触发属性更改通知。仍然没有反映在UI中,因为我刚刚提到的根本原因。这个问题有什么解决办法吗?

从组合下拉菜单中选择的值不反映

让我们怀疑你做了这样的东西:

private string _Selection;
    public string Selection
    {
        get { return _Selection; }
        set
        {
            if (_Selection != value)
            {
                if (value == "Other")
                {
                    _Selection = ShowOtherDialog();
                }
                else
                {
                    _Selection = value;
                }
                NotifyPropertyChanged("Selection");
            }
        }
    }

不幸的是,UI不会像那样更新,因为它在将绑定写回源代码时不会侦听通知。

你可能想试试这个:

private string _Selection;
    public string Selection
    {
        get { return _Selection; }
        set
        {
            if (_Selection != value)
            {
                if (value == "Other")
                {
                    Application.Current.Dispatcher.BeginInvoke(
                        new Action(() =>
                        {
                            _Selection = ShowOtherDialog();
                            NotifyPropertyChanged("Selection");
                       }));                      
                }
                else
                {
                    _Selection = value;
                    NotifyPropertyChanged("Selection");   
                }

            }
        }
    }