无法将ComboBoxItem.IsEnabled设置为Binding

时间:2010-08-14 15:29:46

标签: silverlight xaml silverlight-4.0

我有一天充满了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}改为TrueFalse,那么它可以正常工作。

我完全感到困惑,因为ComboBoxItem.IsEnabledDependencyProperty并且不是只读,所以错误信息是完全垃圾。

任何想法如何解决这个问题?最终,我想要做的就是将IsEnabled上的ComboBoxItem属性绑定到我的视图模型上的属性。

PS。是的,我还尝试将ItemsSource绑定到我的视图模型集合,并确保IsEnabled属性实际存在于我的视图模型中。同样的问题。

3 个答案:

答案 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名称