我有一天充满了Silverlight idiosynchrasies,包括这个小小的doozy:
<ComboBox>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
</Style>
</ComboBox.ItemContainerStyle>
<ComboBoxItem>First</ComboBoxItem>
<ComboBoxItem>Second</ComboBoxItem>
</ComboBox>
上述内容失败了:
System.Windows.Markup.XamlParseException occurred
Message=Set property '' threw an exception. [Line: 88 Position: 52]
LineNumber=88
LinePosition=52
StackTrace:
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
InnerException: System.NotSupportedException
Message=Cannot set read-only property ''.
StackTrace:
at MS.Internal.XamlMemberInfo.SetValue(Object target, Object value)
at MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken inType, XamlQualifiedObject& inObj, XamlPropertyToken inProperty, XamlQualifiedObject& inValue)
InnerException:
如果我将{Binding IsEnabled}
改为True
或False
,那么它可以正常工作。
我完全感到困惑,因为ComboBoxItem.IsEnabled
是DependencyProperty
并且不是只读,所以错误信息是完全垃圾。
任何想法如何解决这个问题?最终,我想要做的就是将IsEnabled
上的ComboBoxItem
属性绑定到我的视图模型上的属性。
PS。是的,我还尝试将ItemsSource
绑定到我的视图模型集合,并确保IsEnabled
属性实际存在于我的视图模型中。同样的问题。
答案 0 :(得分:1)
我现在通过覆盖PrepareContainerForItemOverride
来解决这个问题,如下所示:
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
// can't do this in ItemContainerStyle because SL is poo
(element as ComboBoxItem).SetBinding(ComboBoxItem.IsEnabledProperty, new Binding("IsEnabled"));
}
这在SL4中是否真的无法实现?对我来说似乎完全是荒谬的,就像我今天遇到的所有其他问题一样。
答案 1 :(得分:0)
也许这有点偏离基础(并且迟到)但是它可能与绑定对象上属性的命名有关吗?
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
如果路径不是IsEnabled
,可以在XAML中执行吗?
答案 2 :(得分:0)
我知道这个线程已经老了,但今天我遇到了同样的问题,我只想确认Dave Lowther所说的是这个案例的问题。
将属性名称从IsEnabled
更改为IsComboBoxItemEnabled
后,所有内容都开始正常运行,因此请不要在模型中使用IsEnabled
名称