为什么Silverlight中的双向绑定不起作用?

时间:2009-02-16 14:51:05

标签: silverlight data-binding two-way-binding

根据Silverlight TwoWay绑定的工作原理,当我更改FirstName字段中的数据时,它应该更改CheckFirstName字段中的值。

为什么不是这样?

解答:

谢谢Jeff,就是这样,对于其他人:这里是the full solution with downloadable code

XAML:

<StackPanel>
    <Grid x:Name="GridCustomerDetails">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="300"/>
        </Grid.ColumnDefinitions>

        <TextBlock VerticalAlignment="Center" Margin="10" Grid.Row="0" Grid.Column="0">First Name:</TextBlock>
        <TextBox Margin="10" Grid.Row="0" Grid.Column="1" Text="{Binding FirstName, Mode=TwoWay}"/>

        <TextBlock VerticalAlignment="Center" Margin="10" Grid.Row="1" Grid.Column="0">Last Name:</TextBlock>
        <TextBox Margin="10" Grid.Row="1" Grid.Column="1" Text="{Binding LastName}"/>

        <TextBlock VerticalAlignment="Center" Margin="10" Grid.Row="2" Grid.Column="0">Address:</TextBlock>
        <TextBox Margin="10" Grid.Row="2" Grid.Column="1" Text="{Binding Address}"/>

    </Grid>

    <Border Background="Tan" Margin="10">
        <TextBlock x:Name="CheckFirstName"/>
    </Border>

</StackPanel>

代码背后:

public Page()
{
    InitializeComponent();

    Customer customer = new Customer();
    customer.FirstName = "Jim";
    customer.LastName = "Taylor";
    customer.Address = "72384 South Northern Blvd.";

    GridCustomerDetails.DataContext = customer;

    Customer customerOutput = (Customer)GridCustomerDetails.DataContext;
    CheckFirstName.Text = customer.FirstName;

}

3 个答案:

答案 0 :(得分:5)

您的Customer类型必须支持INotifyPropertyChanged才能让绑定知道您的FirstName属性值何时发生了变化。

tutorial可以帮助您使代码生效。

答案 1 :(得分:1)

解决方案是使用CheckFirstName

的元素绑定

答案 2 :(得分:1)

Grid容器内的控件不知道FirstName,LastName和Address是什么。我认为您需要将网格绑定到代码隐藏中的对象:

<Grid x:Name="GridCustomerDetails" DataContext="Customer"> 

现在,该容器内的每个控件都可以绑定到Customer的属性。你这样绑定它:

<TextBox Margin="10" Grid.Row="0" Grid.Column="1" 
         Text="{Binding Path=FirstName, Mode=TwoWay}"/>   

在您的代码中,确保“Cu​​stomer”是一个类对象,并公开声明。

如果这不起作用,请尝试在顶部的页面声明和命名空间中添加x:Name =“”。

我希望这有帮助!