【问题标题】:Error when Databinding with mode=twoway使用 mode=twoway 进行数据绑定时出错
【发布时间】:2011-10-21 05:05:10
【问题描述】:

所有, 我在这里用头撞墙。我需要的很简单,我确信有一个简单的答案,但我似乎找不到它。 情况:我有一个 Silver light 4.0 应用程序,我目前正在将一个字符串列表绑定到一个 Items 控件。在数据模板中,我有一个简单的文本框,我正在做非常基本的绑定“{Binding}”。我需要将绑定更新为双向,以便编辑自动推送回我的数据上下文。

这是更新绑定之前的 Items 控件:

<ItemsControl x:Name="spLiftHeader" ItemsSource="{Binding Path=WeekLabels}">
   <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
             <StackPanel x:Name="spLiftHeader" Orientation="Horizontal" />
        </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
         <DataTemplate>
              **<TextBox x:Name="txtWeekLbl" Text="{Binding}" Foreground="Black" Width="125" TextAlignment="Center"/>**
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这是绑定更改后的项目控件:

<ItemsControl x:Name="spLiftHeader" ItemsSource="{Binding Path=WeekLabels}">
   <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
              <StackPanel x:Name="spLiftHeader" Orientation="Horizontal" />
        </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
        <DataTemplate>
            **<TextBox x:Name="txtWeekLbl" Text="{Binding Mode=TwoWay}" Foreground="Black" Width="125" TextAlignment="Center"/>**
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我只是简单地将“Mode=TwoWay”添加到绑定中。 更新后,我得到了惊人的无用错误 4004 “System.Windows.Markup.XamlParseException:在 'System.Windows.Data.Binding' 上提供值引发异常”并且 Line/Position 参考点正确执行我更新的绑定。 如何将双向模式添加到简单绑定中? 提前致谢。 尼克

【问题讨论】:

  • +1 欢迎来到 Stack Overflow :)

标签: silverlight binding


【解决方案1】:

双向绑定到整个对象(在本例中为字符串)对 Silverlight 没有意义,因此引发异常是正确的。可惜它不是一个更有用的错误消息:)

当绑定中没有路径时,ItemsControl 可以使用 Object.ToString() 获取值,但是它将结果存储在哪里呢?它不能替换字符串,因为这需要将新的字符串对象放回集合中。双向绑定是通过对对象属性的反射来完成的。

使用包含字符串属性并显式绑定到该属性的一些新对象的列表,而不是简单的字符串列表。这将使一切变得容易得多。 (确保您的新类和属性实现 INotifyPropertyChanged)。

【讨论】:

  • +1 然而 INotifyPropertyChanged 是正统和标准的做法,但除非你知道它确实需要它,否则它会不必要地膨胀一个简单的类(想想自动属性)。
  • @AnthonyWJones:我认为数据的隐含使用保证了这一点,但公平点:如果这个列表是唯一显示和修改字符串的东西,你不需要 INotifyPropertyChanged 因为没有其他需要通知:)
  • 感谢您的精彩解释。我已将该对象更新为带有成员变量的数据合同,并且它工作得很好。
【解决方案2】:

我不是 100% 确定,但我认为 Mode=TwoWay 不应该在 TextBox 本身中设置。

如果这不起作用,请尝试两者。但是,在任何一种情况下都不要使用List&lt;T&gt; 作为该项目控件背后的数据源。当其中一项发生更改时,列表不会触发更改事件。使用ObservableCollection&lt;T&gt;(来自System.Collections.ObjectModel 命名空间)而不是List&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多