3

可能重复:
绑定到 List<string> 时如何使 ListBox 可编辑?

我正在尝试在名为“ListStr”对象的列表和 ListBox WPF 控件之间设置两个绑定。此外,我希望这些项目是可编辑的,所以我添加了一个带有 TextBoxes 的 DataTemplate,希望它可以通过 TextBoxes 直接修改 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 x:Key="dtplItemTextContentListBoxEdit">
    <TextBox Text="{Binding Path=.}" Width="175" />
</DataTemplate>
4

2 回答 2

8

使用时两种方式绑定不起作用{Binding Path=.}(对于 来说很长{Binding})。记住正在发生的事情。

ListBox给定一个对象列表,然后为每个项目创建一个ListBoxItem。然后将DataContextListBoxItem设置为该对象。当你使用时{Binding},你是说只使用DataContext. 当您在 TextBox 中键入内容时,它会更新什么?它无法设置 DataContext 并且不知道对象来自哪里(因此它无法更新您的列表/数组)。

两种方式绑定起作用的地方是当您绑定到该对象上的属性时。但不是当你绑定到对象本身时。

于 2012-12-19T14:08:39.713 回答
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);
            }
        }
    }
}


xml:

 <DataTemplate>
    <TextBox Text="{Binding Text}" Width="175" />
 </DataTemplate>
于 2012-12-19T15:11:55.367 回答