0

嘿,令人尴尬的是,我无法从我找到的示例中获得双向绑定。这是我的数据模板之一。

     <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 itemsource。

数据类在哪里:

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

这是我尝试过的,但没有成功。希望您能帮助我进行调整,使我可以在 Data 中为Post提供双向绑定。

额外信息

我现在尝试了 mode=TwoWay,终于让它工作了。代码已更新。

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

所以我需要设置UpdateSourceTrigger。

但这应该设置为什么?

解决方案

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

UpdateSourceTrigger = Explicit 在这里是一个聪明的奖励。它是什么?显式:仅在调用 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();
      }:
4

1 回答 1

0

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

Windows phone 不支持UpdateSourceTrigger=PropertyChanged,但您可以在此处找到一种方法。
或者另一种方法是使用 Prism 库中的UpdateTextBindingOnPropertyChanged。您可以下载我链接的文件的源代码,然后在 xaml 中设置它,如下所示:

<TextBox ...>
    <i:Interaction.Behaviors>
         <prism:UpdateTextBindingOnPropertyChanged/>
    </i:Interaction.Behaviors>
</TextBox>
于 2013-09-29T16:52:08.260 回答