ListBox绑定到ObservableCollection <string>

时间:2018-04-01 21:56:28

标签: c# listbox observablecollection datacontext

在下面的类中,列表框的itemssource应该绑定到Interfaces属性。

public class BaseClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private const string TYPE_TITLE = "Type";

    private string  _Type;

    public string Type
    {
        get { return _Type; }
        set { _Type = value; this.NotifyPropertyChanged(PropertyChanged, TYPE_TITLE); }
    }

    public ObservableCollection<string> Interfaces { get; set; }

    public BaseClass()
    {
        Interfaces = new ObservableCollection<string>();
    }

    public void Reset()
    {
        _Type = null;
        Interfaces.Clear();
    }
}

在该列表框中,所选项目应该能够编辑为内联编辑方案,

<DataTemplate x:Key="BaseClass_Interfaces_InlineEdit_Template">
    <TextBox Text="{Binding Mode=TwoWay, Path=., NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged"/>
</DataTemplate>
<DataTemplate x:Key="BaseClass_Interfaces_InlineView_Template">
    <TextBlock Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>

<Style TargetType="{x:Type ListBoxItem}" x:Key="BaseClass_Iterfaces_ItemStyle_Template">
    <Setter Property="ContentTemplate" Value="{StaticResource BaseClass_Interfaces_InlineView_Template}" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="ContentTemplate" Value="{StaticResource BaseClass_Interfaces_InlineEdit_Template}" />
        </Trigger>
    </Style.Triggers>
</Style>

ListBox有一个容器作为父层次结构,其DataContext属性绑定到BaseClass的实例,因此ListBox可以绑定到Interfaces属性。

<ListBox Grid.Row="2" Grid.ColumnSpan="2" Margin="3" ItemsSource="{Binding Interfaces, Mode=TwoWay}" SelectionMode="Single"
             ItemContainerStyle="{StaticResource ResourceKey=BaseClass_Iterfaces_ItemStyle_Template}" />
  • 选择任何项目之前的列表框
    The list box before select any item
  • 编辑所选项目
    Editing the selected item
  • 编辑后选择另一个项目,更改不受影响 Selection changed after edit

有两个问题:

  1. TextBox应该有“Path =。”否则“双向绑定需要Path或XPath”。收到异常消息。
  2. 考虑到上述问题,ObservableCollection项目在文本更改后从未更新!!!!!!

1 个答案:

答案 0 :(得分:0)

我找到了答案!
我想知道的是文本框改变了文本属性但是更改没有传播到源,基于link绑定机制对源的属性起作用,换句话说,属性的更改不会监视对象本身。
解决方案是围绕字符串的包装类,我之前为另一个原始类型(bool)编写了这个包装器。

public class Wrapper<T>
{
    public T Item { get; set; }

    public Wrapper(T value = default(T))
    {
        Item = value;
    }

    public static implicit operator Wrapper<T>(T item)
    {
        return new Wrapper<T>(item);
    }

    public static implicit operator T(Wrapper<T> item)
    {
        if (null != item)
            return item.Item;

        return default(T);
    }
}

所以编辑数据模板改变如下

<DataTemplate x:Key="BaseClass_Interfaces_InlineEdit_Template">
    <TextBox Text="{Binding Mode=TwoWay, Path=Item, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>  

每件事都充满了魅力!!!