【问题标题】:Databinding issue with textbox and accessors文本框和访问器的数据绑定问题
【发布时间】:2011-08-08 23:16:54
【问题描述】:

我想知道我错过了什么?绑定根本不显示在文本框中。这些是我的代码:

XAML 命名空间:

xmlns:c="clr-namespace:mySystem.Workspace"

数据上下文和资源:

<Grid.Resources>
        <c:Parameter x:Key="mySource"/>
    </Grid.Resources>
    <Canvas>
        <Canvas.DataContext>
            <Binding Source="{StaticResource mySource}" />
        </Canvas.DataContext>

文本框:

<TextBox x:Name="TextBox" Width="159" Height="26" Canvas.Left="36" Canvas.Top="47">
            <TextBox.Text>
                <Binding Path="JobKey" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
            </TextBox.Text>

班级:

namespace mySystem.Workspace
{
  public class Parameter : Object  
  { 

访问者:

 public BasePar JobKey
 {
   get { return jobKey; }
   set { jobKey = value; }
 }

【问题讨论】:

    标签: wpf data-binding object binding accessor


    【解决方案1】:

    这里有很多奇怪的东西,但最明显的一点是绑定路径区分大小写。

    将您的绑定更改为:

    <Binding Path="JobKey" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
    

    这应该使绑定工作。

    我也不确定 BasePar 是什么类型,或者应该是什么类型,但除非你故意做一些聪明的事情,否则只要把它变成一个标准类型,比如字符串。

    您也不应该使用命名空间System.Workspace,而是使用与您自己的项目相关的东西。


    在您的回复之后,我唯一能猜到 BasePar 对象的用途是在 DataTemplate 中使用,例如 ItemsControl。 DataTemplate 的行为是,当它们不知道如何呈现对象时,它们会退回到对象的 .ToString() 方法。

    现在,在我的评论中,我说我认为 TextBox 不能有 DataTemplate,我相信这是真的然而我确实在 this Stackoverflow question 找到了一个技巧一个内容控件和一个文本块。代码如下:

    <Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:System.Workspace"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <c:Parameter x:Key="mySource"/>
    
            <DataTemplate x:Key="MyDataTemplate">
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </Grid.Resources>
    
        <Canvas>
            <Canvas.DataContext>
                <Binding Source="{StaticResource mySource}" />
            </Canvas.DataContext>
    
            <ContentControl            
               Content="{Binding Path=JobKey}"             
               ContentTemplate="{StaticResource MyDataTemplate}" />
        </Canvas>
    
    </Grid>
    

    我现在没有时间让 TextBox 工作 - 考虑到我最初的几次尝试,我什至不知道这是否可能。但是,这可能会帮助您到达需要去的地方。

    但是 - 如果我是我,我只会使用简单的绑定到标准对象。在这种情况下,我看不到 BasePar 类的好处。

    【讨论】:

    • 我已将我的代码更新为 mySystem.Workspace 和“JobKey”作为绑定路径。 - 还是行不通。 BasePar 是一个用于处理不同类型的类——字符串、双精度、整数。一位专家基于 MVVM 模型松散地创建了这个,我正在尝试为他创建的类做 UI。
    • @Ben 我刚刚尝试过使用几乎完全一样的方法,唯一的区别是 JobKey 是作为类型字符串。我从来没有尝试过使用像你正在做的绑定类。如果您尝试使用该属性返回字符串进行绑定会发生什么?
    • @Ben 刚用谷歌搜索,看起来你可以做类似 Text="{Binding PropObj1.prop1}" 之类的事情,你能把 BasePar 的代码包括进来,这样我们就可以看到它是如何使用的?
    • @Ben 我认为您需要与制作该课程的人核实。我认为该类的唯一用途是在 DataTemplate 中使用,它的行为是当无法识别 Object 类型时,它使用 Object 的 .ToString() 据我所知 TextBox 不能是 DataTemplated ,而且我认为这永远不会奏效。我可能是错的,尽管我仍然认为整个方法太复杂了,我只需要使用返回标准类型的 ViewModel。
    • @David 感谢您的帮助。这很复杂,我会和他核实。至少我可以将问题缩小到班级,谢谢!
    【解决方案2】:

    BasePar 实现是什么样的?查看调试输出窗口,看看是否有这样的一行:

    System.Windows.Data Error: 1 : Cannot create default converter to perform 'two-way' conversions between types 'WpfApplication1.BasePar' and 'System.String'. Consider using Converter property of Binding. BindingExpression:Path=JobKey; DataItem='Parameter' (HashCode=14209755); target element is 'TextBox' (Name='TextBox'); target property is 'Text' (type 'String')

    这告诉您您正在尝试绑定到属性,但 WPF 无法创建双向绑定,因为它无法将文本(您在 TextBox 中键入)转换为“BasePar”对象。

    根据 David 的建议,您可以绑定到原始字符串类型,或者(根据上面的警告消息)您可以将 Converter 添加到绑定中以将字符串转换为 BasePar

    【讨论】:

    • 是的,我可以看到消息。感谢您的意见。
    【解决方案3】:

    您需要通过从 DependencyObject 派生它来使 jobkey 成为 DependencyProperty,或者从 INotifyPropertyChanged 派生您的类并添加所有通知代码等。

    如果您不这样做,那么您将不会收到更新通知,并且您的绑定将无法按预期工作。

    【讨论】:

    • 谢谢,这对我来说是新的,我将不得不阅读。我希望它为我指明了正确的方向。
    【解决方案4】:

    Path="jobKey"

    您需要绑定到属性而不是字段,即将其设为大写。另外:要调试绑定,请检查 Visual Studio 中的输出窗口。

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多