文本框和访问器的数据绑定问题

时间:2011-04-19 19:43:18

标签: wpf data-binding object binding accessor

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

XAML命名空间:

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

DataContext和Resources:

<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; }
 }

4 个答案:

答案 0 :(得分:4)

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

将绑定更改为:

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

这应该可以使绑定工作。

我也不确定BasePar的类型是什么,或者是什么类型,但除非你有意识地做一些聪明的事情,否则就把它变成像字符串这样的标准类型。

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


在你的回复之后,我唯一想到的就是BasePar对象的用途,就是在一个DataConmplate中使用,在ItemsControl上说。 DataTemplates的行为是,当他们不知道如何渲染Object时,他们将回退Object的.ToString()方法。

现在,在我的评论中,我说我不认为TextBox可以有一个DataTemplate,我相信这是真的然而我确实找到了一个技巧{{3其中模板包含内容控件和文本块。代码如下:

<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类的好处。

答案 1 :(得分:3)

BasePar实现是什么样的?在Debug Output窗口中查看是否有这样的行:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

  

路径= “jobKey”

您需要绑定到属性而不是字段,即使用大写字母。另外:要调试绑定,请检查Visiual Studio中的输出窗口。