longlistselector中的双向绑定错误,具有自己的datatemplate和class

时间:2013-09-29 16:45:08

标签: c# xaml data-binding binding windows-phone-8

嘿尴尬我从找到的例子中无法获得双向约束。这是我的一个dataTemplates。

     <local:ChatRoomTemplateSelector.YourSelf>
                            <DataTemplate x:Name="YourSelf">
                                <StackPanel>
                                    <Grid x:Name="YourSelfGrid">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <UserControl Grid.Row="0">
                                            <Path Data="" Fill="LawnGreen" StrokeThickness="0" Stretch="Fill" UseLayoutRounding="True"/>
                                        </UserControl>
                                        <TextBox Text="{Binding Path=Post}" IsReadOnly="{Binding readOnly}" FontSize="20" Margin="39,10" TextWrapping="Wrap" TextAlignment="Center"/>

                                    </Grid>
                                    <StackPanel Orientation="Horizontal">

                                        <Path Data="" Fill="LawnGreen" StrokeThickness="0" Stretch="Fill" UseLayoutRounding="True" Margin="50,-1,0,0"/>

                                        <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="25" TextWrapping="Wrap"/>
                                    </StackPanel>
                                </StackPanel>
                            </DataTemplate>
                        </local:ChatRoomTemplateSelector.YourSelf> 

我需要双向绑定的元素是Text =“{Binding Path = Post}”。但无法让它发挥作用。我拥有的longlistselector,其itemsource设置为:

     System.Collections.ObjectModel.ObservableCollection<Data> source = new System.Collections.ObjectModel.ObservableCollection<Data>();

然后将此源设置为我的Longlistselectors项目源。

Data类的位置是:

     public class Data : INotifyPropertyChanged
{
    public string Name 
    {
        get;
        set;
    }
    private string _dl;
    public string Post
    {
        get { return _dl; }
        set
        {
            if (value != _dl)
            {
                _dl = value;
                NotifyPropertyChanged("Post");
            }
        }
    }

    public string User
    {
        get;
        set;
    }

    public bool readOnly
    {
        get;
        set;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(String name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

这是我尝试过但没有成功。希望你能帮助我进行调整,让我在数据中为发布提供双向绑定。

额外信息

我现在尝试了模式= TwoWay,最后得到了它。代码已更新。

但现在更新只发生在失去焦点上。但是我需要在插入文本时更新变量。

所以我需要设置UpdateSourceTrigger。

但这应该是什么?

解决方案

     <TextBox TextChanged="OnTextBoxTextChanged"
     Text="{Binding MyText, Mode=TwoWay,
            UpdateSourceTrigger=Explicit}" />

UpdateSourceTrigger =明确是一个明智的奖金。它是什么?显式:仅在调用UpdateSource方法时更新绑定源。当用户离开TextBox时,它会为您节省一个额外的绑定集。

在C#中:

     private void OnTextBoxTextChanged( object sender, TextChangedEventArgs e )
      {
       TextBox textBox = sender as TextBox;
        // Update the binding source
        BindingExpression bindingExpr = textBox.GetBindingExpression( TextBox.TextProperty );
        bindingExpr.UpdateSource();
      }:

1 个答案:

答案 0 :(得分:0)

如果您希望TextBox被双向绑定,那么您应该使用Text="{Binding Path=Post,Mode=TwoWay}"

Windows手机不支持UpdateSourceTrigger=PropertyChanged但你可以找到办法here
或者另一种方法是使用Prism库中的UpdateTextBindingOnPropertyChanged。您可以下载我链接的文件的源代码,并在xaml中将其设置为:

<TextBox ...>
    <i:Interaction.Behaviors>
         <prism:UpdateTextBindingOnPropertyChanged/>
    </i:Interaction.Behaviors>
</TextBox>