有人可以澄清一下這個錯誤嗎?'System.Windows.Data.Binding'不是屬性'SelectedIndex'的有效值
起初我以爲SelectedIndex可能只是不是一個DependencyProperty,不能綁定,但我錯了。
如果我使用普通綁定而不是標記擴展src:ValidatedBinding
,或者如果我保留標記擴展但綁定SelectedItem
而不是SelectedIndex
,那麼它就可以工作。
這是一個小應用程序來演示問題。
主窗口:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WpfApplication2"
Title="MainWindow"
Height="350"
Width="525"
>
<ComboBox SelectedIndex="{src:ValidatedBinding SelectedIndex}"
VerticalAlignment="Center" HorizontalAlignment="Center" Width="100">
<ComboBoxItem>Not Specified</ComboBoxItem>
<ComboBoxItem>First</ComboBoxItem>
<ComboBoxItem>Second</ComboBoxItem>
</ComboBox>
</Window>
主窗口後面的代碼:
using System.Windows;
namespace WpfApplication2
{
/// <summary>
/// The main window.
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Item { Description = "Item 1", SelectedIndex = 0 };
}
}
/// <summary>
/// An object with a string and an int property.
/// </summary>
public sealed class Item
{
int _selectedIndex;
string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
public int SelectedIndex
{
get { return _selectedIndex; }
set { _selectedIndex = value; }
}
}
}
的標記擴展的代碼:
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace WpfApplication2
{
/// <summary>
/// Creates a normal Binding but defaults NotifyOnValidationError and
/// ValidatesOnExceptions to True, Mode to TwoWay and UpdateSourceTrigger
/// to LostFocus.
/// </summary>
[MarkupExtensionReturnType(typeof(Binding))]
public sealed class ValidatedBinding : MarkupExtension
{
public ValidatedBinding(string path)
{
Mode = BindingMode.TwoWay;
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
Path = path;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var Target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
/* on combo boxes, use an immediate update and validation */
DependencyProperty DP = Target.TargetProperty as DependencyProperty;
if (DP != null && DP.OwnerType == typeof(System.Windows.Controls.Primitives.Selector)
&& UpdateSourceTrigger == UpdateSourceTrigger.LostFocus) {
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
}
return new Binding(Path) {
Converter = this.Converter,
ConverterParameter = this.ConverterParameter,
ElementName = this.ElementName,
FallbackValue = this.FallbackValue,
Mode = this.Mode,
NotifyOnValidationError = true,
StringFormat = this.StringFormat,
ValidatesOnExceptions = true,
UpdateSourceTrigger = this.UpdateSourceTrigger
};
}
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public string ElementName { get; set; }
public object FallbackValue { get; set; }
public BindingMode Mode { get; set; }
[ConstructorArgument("path")]
public string Path { get; set; }
public string StringFormat { get; set; }
public UpdateSourceTrigger UpdateSourceTrigger { get; set; }
}
}
例外,當我運行該應用程序:
System.Windows.Markup.XamlParseException發生
的HResult = -2146233087消息= 「設置屬性 'System.Windows.Controls.Primitives.Selector.SelectedIndex' 拋出 異常。'行號'9'和行位置'19'。
源= PresentationFramework LineNumber上= 9 LinePosition = 19
堆棧跟蹤: 在System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,IXamlObjectWriterFactory writerFactory,布爾 skipJournaledProperties,對象rootObject,XamlObjectWriterSettings 設置,烏里基本URI) 在系統.Windows.Markup.WpfXamlLoader.LoadBaml(xamlReader xamlReader,布爾skipJournaledProperties,對象rootObject, XamlAccessLevel ACCESSLEVEL,烏里基本URI) 在System.Windows.Markup.XamlReader.LoadBaml(流流,parserContext parserContext,父對象,布爾closeStream) 在System.Windows.Application.LoadComponent(對象組件,Uri resourceLocat或) 在WpfApplication2.MainWindow.InitializeComponent()在C:\用戶\管理員\文件\的Visual Studio 2012 \項目\ WpfApplication2 \ MainWindow.xaml:線1 在WpfApplication2.MainWindow..ctor(c)中:\用戶\管理員\文件\的Visual Studio 2012 \項目\ WpfApplication2 \ MainWindow.xaml.cs:線12
的InnerException信息:System.ArgumentException 的HResult = -2147024809 消息= 'System.Windows.Data.Binding' 不是屬性'SelectedIndex'的有效值爲。 源= WindowsBase 堆棧跟蹤: 在System.Windows.DependencyObject.SetValueCommon(的DependencyProperty DP, 對象值,PropertyMetadata元數據,布爾 coerceWithDeferredReference,布爾coerceWithCurrentValue, OperationType operationType,布爾isInternal) 在System.Windows.DependencyObject.SetValue (DependencyProperty dp,Object value) at System.Windows.Baml2006.WpfMemberInvoker。的SetValue(Object實例, 對象的值) 在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember構件, 對象OBJ,對象的值) 在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(對象研究所, XamlMember屬性,對象的值) 的InnerException:
'SelectedIndex'是一個'int'。你不能在'int'屬性中放置'System.Windows.Data.Binding'。你的'MarkupExtension'是錯誤的。你正在返回'Binding'本身,而不是評估它並返回'Binding Source'。 – 2013-03-20 21:28:59
@HighCore - 但一個普通的'{Binding xxx}'也不是'int'。我不明白。如果我使用'{Binding SelectedIndex}'而不是'{src:ValidatedBinding SelectedIndex}',那麼它就會工作,並且基本上都返回一個綁定。我在哪裏錯過了船? – 2013-03-20 21:38:12
'Binding'標記擴展不會返回'Binding'實例,它會創建綁定並返回另一端的值(Source) – 2013-03-20 21:50:04