C# 将文本框绑定到Listview GridViewColumn

C# 将文本框绑定到Listview GridViewColumn,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我希望将单个文本框绑定到gridviewcolumn中的值。 但是,在编辑文本框时,我希望它也编辑和更新我选择的网格视图列行 XAML ListViewItem是我构建的自定义类 public class ListViewItem : INotifyPropertyChanged { private string[] _values; #region Properties public string[] Values {

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

XAML

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


我也希望这与一个组合框工作。请帮助:)

您正在绑定到
字符串
,并且由于
字符串
类未实现
INotifyPropertyChanged
接口,因此目标属性(列)将不会更新

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

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

您正在更新集合中的字符串,因此需要对集合项实现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}"/>


yes,多亏了@mm8,我实现了这一点,这很有意义,但它仍然无法实时匹配这些值。只有在项目点击。我应该更清楚,它现在正在更新,但焦点退出。是否可以改为在按键时更新?编辑:UpdateSourceTrigger=PropertyChanged可解决此问题。谢谢是的,默认情况下,文本框控件仅在失去焦点时更新。很高兴你成功了!
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}"/>