mvvm:当ItemsSource获取值时触发的listview选择项

时间:2014-02-12 09:29:12

标签: c# wpf xaml listview mvvm

我是MVVM的新用户我有一个文本框和一个Listview。当文本框文本(PONo)发生变化时,listview会通过过滤文本来填充一些数据(PORecords)。

我的观点是:

<TextBox Height="24"         
         VerticalAlignment="Top"
         Width="119"
         Text="{Binding Path=PONo,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
        />

  <ListView Height="161"
            ItemsSource="{Binding Path=PORecords}"
            SelectedItem="{Binding Path=SelectedPO,Mode=TwoWay}"
            IsSynchronizedWithCurrentItem="True"
            Visibility="{Binding Path=PORecords,Converter={StaticResource   ResourceKey=NullToVisibilityConverter}}"
                              Width="357">
            <ListView.View>
               <GridView>
                   <GridViewColumn DisplayMemberBinding="{Binding Path=PurchaseOrderRefNo}"
                                                Header="Order No"
                                                Width="100" />
                   <GridViewColumn DisplayMemberBinding="{Binding Path=OrderDate, StringFormat=dd-MMM-yyyy}"
                                                Header="Order Date"
                                                Width="100" />
          </GridView>
         </ListView.View>
  </ListView>

我的ViewModel是:

 private string _pONo;
    public string PONo
    {
        get { return _pONo; }
        set
        {
            if (value != "" && value!=null)
            {
                _pONo = value;
                List<Tbl_PurchaseOrderMain> _lst = new List<Tbl_PurchaseOrderMain>();
                _lst = new Tbl_PurchaseOrderMain().Select(" PurchaseOrderRefNo like '" + _pONo + "%'");
                if (_lst.Count != 0)
                {
                    PORecords = _lst;
                }
                else
                {
                    PORecords = null;
                }
            }
            else
            {
                PORecords = null;
            }
            RaisePropertyChanged("PONo");
        }
    }

 private List<Tbl_PurchaseOrderMain> _pORecords;
    public List<Tbl_PurchaseOrderMain> PORecords
    {
        get { return _pORecords; }
        set
        {
            _pORecords = value;
            RaisePropertyChanged("PORecords");
        }
    }

 private Tbl_PurchaseOrderMain _selectedPO;
    public Tbl_PurchaseOrderMain SelectedPO
    {
        get { return _selectedPO; }
        set
        {
                _selectedPO = value;
                if (SelectedPO != null)
                {
                    PONo = SelectedPO.PurchaseOrderRefNo;
                }
                else
                {
                    PONo = null;
                }
                RaisePropertyChanged("SelectedPO");
        }
    }

我的问题是,当我在文本框中输入文本时,它将使用三个Item填充listview(PORecords)。那一刻,selectedPO属性也被触发,然后textBox填充PONo,但我的listview只有一个Item其他两个项目都没了。实际上我没有选择Listview上的任何项目。我想只在我从listview中选择一个项目时才填充文本框,我的代码有什么错误吗?

0 个答案:

没有答案