WPF组合框IsDropDownOpen属性绑定OneWayToSource模式与WriteOnly属性

本文关键字:属性 模式 WriteOnly OneWayToSource 绑定 IsDropDownOpen WPF 组合 | 更新日期: 2023-09-27 18:26:03

在一个简单的WPF MVVM应用程序中,我得到了如下视图:

<Grid DataContext="{StaticResource PageViewModel}">
    <StackPanel>
       <ComboBox Width="100" Margin="10"
                 IsDropDownOpen="{Binding ComboOpen, Mode=OneWayToSource}"
                 IsEditable="True">
           <ComboBoxItem>1</ComboBoxItem>
           <ComboBoxItem>2</ComboBoxItem>
           <ComboBoxItem>3</ComboBoxItem>
           <ComboBoxItem>4</ComboBoxItem>
           <ComboBoxItem>5</ComboBoxItem>
       </ComboBox> 
    </StackPanel>  
</Grid>

视图模型类似于:

public bool ComboOpen
{
    set 
    { 
        System.Diagnostics.Debug.Print(" Combobox is " + (value?" dropped down":" closed"));         
    }
}

我在构建应用程序的Windows7上得到了正确的行为。当我运行应用程序时,我可以看到组合框是可拖放的,用户可以放下组合框并选择值。我还可以在组合框中键入以选择一个值。

在那之后,我拿了这个应用程序,并在Windows Xp SP3上运行了它。我再也不能放下combobox了。我能够输入值,从而选择正确的项目。

有人能告诉我为什么combobox在Windows XP Sp3中没有下降吗?

提前感谢。。。

[更新:2014年10月13日]只是为了提供更多信息:我试图在家用机器上重现这个问题,令我惊讶的是,在Windows 7上,我无法降低下拉框。我从工作机器和家用机器上复制了调试日志:

来自损坏的本地机器的调试日志:

'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'mscorlib'v4.0_4.0.0.0__b77a5c561934e089'mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.HostingProcess.Utilities'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.HostingProcess.Utilities.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Windows.Forms'v4.0_4.0.0.0__b77a5c561934e089'System.Windows.Forms.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Drawing'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Drawing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System'v4.0_4.0.0.0__b77a5c561934e089'System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.HostingProcess.Utilities.Sync'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.Debugger.Runtime'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.Debugger.Runtime.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Users'XXXXXX'Desktop'X'DropdownIssue'bin'Debug'DropdownIssue.vshost.exe', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'System.Data'v4.0_4.0.0.0__b77a5c561934e089'System.Data.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Core'v4.0_4.0.0.0__b77a5c561934e089'System.Core.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xml'v4.0_4.0.0.0__b77a5c561934e089'System.Xml.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'Microsoft.CSharp'v4.0_4.0.0.0__b03f5f7f11d50a3a'Microsoft.CSharp.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xml.Linq'v4.0_4.0.0.0__b77a5c561934e089'System.Xml.Linq.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Data.DataSetExtensions'v4.0_4.0.0.0__b77a5c561934e089'System.Data.DataSetExtensions.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xaml'v4.0_4.0.0.0__b77a5c561934e089'System.Xaml.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'WindowsBase'v4.0_4.0.0.0__31bf3856ad364e35'WindowsBase.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'PresentationCore'v4.0_4.0.0.0__31bf3856ad364e35'PresentationCore.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'PresentationFramework'v4.0_4.0.0.0__31bf3856ad364e35'PresentationFramework.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
The thread 'vshost.NotifyLoad' (0x2150) has exited with code 0 (0x0).
The thread '<No Name>' (0x2088) has exited with code 0 (0x0).
The thread '<No Name>' (0x20f4) has exited with code 0 (0x0).
The thread 'vshost.LoadReference' (0x1604) has exited with code 0 (0x0).
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Users'XXXXXXXXXX'Desktop'X'DropdownIssue'bin'Debug'DropdownIssue.exe', Symbols loaded.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Configuration'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Step into: Stepping over non-user code 'DropdownIssue.App.App'
Step into: Stepping over non-user code 'DropdownIssue.App.InitializeComponent'
Combobox is  closed
System.Windows.Data Error: 17 : Cannot get 'ComboOpen' value (type 'Boolean') from '' (type 'PageViewModel'). BindingExpression:Path=ComboOpen; DataItem='PageViewModel' (HashCode=52085517); target element is 'ComboBox' (Name=''); target property is 'IsDropDownOpen' (type 'Boolean') ArgumentException:'System.ArgumentException: Property Get method was not found.
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
   at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'PresentationFramework.Aero'v4.0_4.0.0.0__31bf3856ad364e35'PresentationFramework.Aero.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

从正常工作的计算机调试日志。

'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'mscorlib'v4.0_4.0.0.0__b77a5c561934e089'mscorlib.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.HostingProcess.Utilities'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.HostingProcess.Utilities.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Windows.Forms'v4.0_4.0.0.0__b77a5c561934e089'System.Windows.Forms.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Drawing'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Drawing.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System'v4.0_4.0.0.0__b77a5c561934e089'System.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.HostingProcess.Utilities.Sync'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'assembly'GAC_MSIL'Microsoft.VisualStudio.Debugger.Runtime'10.0.0.0__b03f5f7f11d50a3a'Microsoft.VisualStudio.Debugger.Runtime.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'D:'Temp'DropdownIssue'DropdownIssue'bin'Debug'DropdownIssue.vshost.exe'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'System.Data'v4.0_4.0.0.0__b77a5c561934e089'System.Data.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Core'v4.0_4.0.0.0__b77a5c561934e089'System.Core.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xml'v4.0_4.0.0.0__b77a5c561934e089'System.Xml.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'Microsoft.CSharp'v4.0_4.0.0.0__b03f5f7f11d50a3a'Microsoft.CSharp.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xml.Linq'v4.0_4.0.0.0__b77a5c561934e089'System.Xml.Linq.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Data.DataSetExtensions'v4.0_4.0.0.0__b77a5c561934e089'System.Data.DataSetExtensions.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xaml'v4.0_4.0.0.0__b77a5c561934e089'System.Xaml.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'WindowsBase'v4.0_4.0.0.0__31bf3856ad364e35'WindowsBase.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_32'PresentationCore'v4.0_4.0.0.0__31bf3856ad364e35'PresentationCore.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'PresentationFramework'v4.0_4.0.0.0__31bf3856ad364e35'PresentationFramework.dll'
The thread 'vshost.NotifyLoad' (0x4680) has exited with code 0 (0x0).
The thread 'vshost.LoadReference' (0x3b70) has exited with code 0 (0x0).
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'D:'Temp'DropdownIssue'DropdownIssue'bin'Debug'DropdownIssue.exe', Symbols loaded.
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Configuration'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Configuration.dll'
Step into: Stepping over method without symbols 'DropdownIssue.App.App'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'PresentationFramework-SystemData'v4.0_4.0.0.0__b77a5c561934e089'PresentationFramework-SystemData.dll'
 Combobox is  closed
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'PresentationFramework.Aero'v4.0_4.0.0.0__31bf3856ad364e35'PresentationFramework.Aero.dll'
'DropdownIssue.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'UIAutomationTypes'v4.0_4.0.0.0__31bf3856ad364e35'UIAutomationTypes.dll'
The thread '<No Name>' (0xf60) has exited with code 0 (0x0).

WPF组合框IsDropDownOpen属性绑定OneWayToSource模式与WriteOnly属性

必须向MS Support打开票证才能解决此问题。他们建议如下:

  1. 基于OneWayToSource设计,不需要getter
  2. xaml解析器是在.Net 4.0中重新设计的,这是它的遗留问题。Net 4.5+已经修复了这个问题

我已经在.NET 4.5中进行了验证,问题在那里得到了解决。

添加",Mode=OneWayToSource";解决了最初的get错误!