使用DataTemplate的ListBox的WPF TwoWay绑定

时间:2012-12-19 13:57:23

标签: wpf xaml binding listbox datatemplate

  

可能重复:
  How to make ListBox editable when bound to a List<string>?

我正在尝试在名为“ListStr”对象的List和ListBox WPF控件之间设置两个绑定。 除了我希望项目是可编辑的,所以我添加了一个带有TextBoxes的DataTemplate,期望它可以通过TextBox直接修改ListStr项目。

但是当我试图编辑其中一个时,它不起作用......

任何想法?

PS:我试图添加Mode = TwoWay参数,但它仍然无法正常工作

这是XAML:

<ListBox ItemsSource="{Binding Path=ListStr}" Style="{DynamicResource ResourceKey=stlItemTextContentListBoxEdit}" />

以下是样式代码:

<Style x:Key="stlItemTextContentListBoxEdit" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="#FF0F2592" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="150" />
<Setter Property="Width" Value="200" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="ItemTemplate" Value="{DynamicResource ResourceKey=dtplItemTextContentListBoxEdit}" /></Style>

DataTemplate:

<DataTemplate x:Key="dtplItemTextContentListBoxEdit">
    <TextBox Text="{Binding Path=.}" Width="175" />
</DataTemplate>

2 个答案:

答案 0 :(得分:8)

使用{Binding Path=.}{Binding}的长度)时双向绑定不起作用。请记住发生的事情。

ListBox会获得一个对象列表,然后为每个项目创建一个ListBoxItem。然后将DataContext的{​​{1}}设置为该对象。当您使用ListBoxItem时,您只想使用{Binding}中的对象。当您键入TextBox时,它会更新什么?它无法设置DataContext,也不知道对象来自哪里(因此无法更新列表/数组)。

双向绑定确实有效,就是绑定到该对象上的属性。但是当你绑定到对象本身时却不是。

答案 1 :(得分:3)

    public class ViewModel
{
    ObservableCollection<TextItem> _listStr = new ObservableCollection<TextItem> { new TextItem("a"), new TextItem("b"), new TextItem("c") };

    public ObservableCollection<TextItem> ListStr
    {
        get  { return _listStr; }  // Add observable and propertyChanged here also if needed
    }
}

public class TextItem : NotificationObject // (NotificationObject from Prism you can just implement INotifyPropertyChanged)
{
    public TextItem(string text)
    {
        Text = text;
    }

    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            if (_text != value)
            {
                _text = value;
                RaisePropertyChanged(() => Text);
            }
        }
    }
}


XAML:

 <DataTemplate>
    <TextBox Text="{Binding Text}" Width="175" />
 </DataTemplate>