WPF如何设置列表项值?

时间:2014-08-22 22:23:44

标签: wpf binding listitem

我有一个WPF应用程序(MVVM模式),带有数据绑定到字符串和字符串列表:

public string Property
{
    get { return _model.property; }
    set
    {
        if (value == _model.property)
        {
            return;
        }
        _model.property= value;
        base.NotifyPropertyChanged();
    }
}        

public List<string> PropertyList
{
    get { return _model.PropertyList; }
    set
    {
        if (value == _model.PropertyList)
        {
            return;
        }
        _model.PropertyList= value;
        base.NotifyPropertyChanged();
    }
}

我的绑定看起来像这样:

<TextBox Text="{Binding Path=Property, 
                Mode=TwoWay,         
                UpdateSourceTrigger=PropertyChanged}"
>

<TextBox Text="{Binding Path=PropertyList[0], 
                Mode=TwoWay,         
                UpdateSourceTrigger=PropertyChanged}"
>

看起来很好,对吧? 但是当我调试它并将断点设置为setter和getter时,将永远不会调用PropertyList setter。但是,PropertyList项0的值具有新值。

那么列表或一个项目的绑定是如何工作的呢?

1 个答案:

答案 0 :(得分:0)

列表在内容更改时不会发出GUI信号,因此您应始终绑定到WPF中的 ObservableCollections ,这样可以毫不费力地为您完成。

问题很可能是你的_model.PropertyList更新,一种处理它的方法,如果两者都使用OC&#39;

选项1

    public ObservableCollection<String> PropertyList
    {
        get { return propertyList; }
        set
        {
            if (Equals(value, propertyList)) return;
            propertyList = value;
            propertyList.CollectionChanged += propertyList_CollectionChanged; // I Hate this
            OnPropertyChanged("PropertyList");
        }
    }

    void propertyList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        OnPropertyChanged("PropertyList"); // when the collection changes signal gui
    }

选项2

我会这样做(假设我理解你想要的东西),只需将此类用作视图的datacontext。 我怀疑这是你定义为_model的?

public class YourViewModel : INotifyPropertyChanged // your ViewModelBase goes here :)
{
    private ObservableCollection<string> propertyList = new ObservableCollection<string>();
    private string property;
    public ObservableCollection<String> PropertyList
    {
        get { return propertyList; }
        set
        {
            if (Equals(value, propertyList)) return;
            propertyList = value;
            OnPropertyChanged("PropertyList");
        }
    }
    public String Property
    {
        get { return property; }
        set
        {
            if (value == property) return;
            property = value;
            OnPropertyChanged("Property");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator] // Comment out if no R#
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

但是为什么你绑定到列表中的第一项?列表的重点是什么? 通常,您将PropertyList绑定到项控件,并将Property绑定为具有双向绑定的SelectedItem。然后,您可以将文本框绑定到此SelectedItem以进行编辑/显示。

IE(非常简单)

<Grid>        
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <ListBox Grid.Row="0"  ItemsSource="{Binding PropertyList}" SelectedItem="{Binding Path=Property, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Grid.Row="1" Text="{Binding Path=Property, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>          
</Grid>

希望它有所帮助,

干杯

了Stian