将文本框绑定到Listview GridViewColumn

时间:2017-03-16 19:05:21

标签: c# wpf xaml mvvm data-binding

我希望将单个文本框绑定到gridviewcolumn中找到的值。 但是,在编辑文本框时,我希望它还可以编辑和更新我选择的网格视图列行。

XAML

<ListView x:Name="ExampleLV" ItemsSource="{Binding Data.Collection}">    
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ColumnName1" DisplayMemberBinding="{Binding Value[0], Mode=TwoWay}"/>
            <GridViewColumn Header="ColumnName2" DisplayMemberBinding="{Binding Value[1], Mode=TwoWay}"/>  
        </GridView>
    </ListView.View>
</ListView>

<TextBox Name="ExampleTB1" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[0]}"/>
<TextBox Name="ExampleTB2" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[1]}"/>

C# - Collection被映射到字符串数组

Collection.Add(new ListViewItem() { Values = new string[] { "abc", "123" } }); 

ListViewItem是我构建的自定义类。

public class ListViewItem : INotifyPropertyChanged
    {
        private string[] _values;

        #region Properties

        public string[] Values
        {
            get { return _values; }
            set
            {
                if (value == _values) return;
                _values = value;
                OnPropertyChanged();
            }
        }

        #endregion

        public event PropertyChangedEventHandler PropertyChanged;//[NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我遇到的问题是正在为文本框更新值,但它们不会更新listviewItem。但是,存储的值只是更新GridViewColumn。

我也希望使用组合框。请帮忙:)

2 个答案:

答案 0 :(得分:1)

您绑定到string,并且由于String类未实现INotifyPropertyChanged接口,因此不会更新目标属性(列)。

您应该绑定到实现string接口的类的属性,而不是绑定到Value[0]数组(Value[1]INotifyPropertyChanged)中的项。

因此,将Values属性的类型从string[]更改为具有两个属性的类型,这两个属性会引发更改通知并绑定到这些属性,而不是绑定到string数组。

答案 1 :(得分:1)

一些事情..

您正在更新集合中的字符串,因此您需要对集合项实施INotify。

类似的东西:

public class ValueViewModel : INotifyPropertyChanged
{
    private string _value;

    public string Value
    {
        get { return _values; }
        set
        {
            if (_value == value) return;

            _value = value;
            OnPropertyChanged();
        }
    }
}

更新ListViewItem ViewModel以使用新的ValueViewModel类型。

public class ListViewItem : INotifyPropertyChanged
{
    private ValueViewModel[] _values;

    #region Properties

    public ValueViewModel[] Values
    {
        get { return _values; }
        set
        {
            if (value == _values) return;
            _values = value;
            OnPropertyChanged();
        }
    }

    #endregion

    public event PropertyChangedEventHandler PropertyChanged;//[NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

最后,更新您的绑定:

<ListView x:Name="ExampleLV" ItemsSource="{Binding Data.Collection}"> 

    <ListView.View>
        <GridView>
            <GridViewColumn Header="ColumnName1" DisplayMemberBinding="{Binding Value[0].Value, Mode=TwoWay}"/>
            <GridViewColumn Header="ColumnName2" DisplayMemberBinding="{Binding Value[1].Value, Mode=TwoWay}"/>  
        </GridView>
    </ListView.View> </ListView>

<TextBox Name="ExampleTB1" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[0].Value}"/> <TextBox Name="ExampleTB2" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[1].Value}"/>