从组合下拉菜单中选择的值不反映
本文关键字:选择 组合 下拉菜单 | 更新日期: 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");
}
}
}
}