簡體   English   中英

將文本框綁定到Listview GridViewColumn

[英]Bind Textbox to Listview GridViewColumn

我想將單個文本框綁定到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.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。

我也想使用組合框。 請幫忙 :)

您將綁定到string並且由於String類未實現INotifyPropertyChanged接口,因此將不會更新目標屬性(列)。

應該綁定到實現INotifyPropertyChanged接口的類的屬性,而不是綁定到string數組中的項目( Value[0]Value[1] )。

因此,將Values屬性的類型從string[]更改為具有兩個引發更改通知並綁定到這些屬性而不是綁定到string數組的屬性的類型。

一些東西..

您正在更新集合中的字符串,因此需要在集合項上實現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}"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM