【问题标题】:MVVM Light Binding to Observable CollectionMVVM Light 绑定到 Observable 集合
【发布时间】:2012-04-27 12:23:54
【问题描述】:

我将 MVVM light 与 EF4 和 SQL CE 4 结合使用,但我的 observable 集合存在问题。我的应用程序不一定需要使用 mvvm 模式,但由于我需要 observablecollection 的好处,我决定学习如何集成它。我可以成功地将我的属性实体数据库链接到我的列表框并显示它们,我还可以将这些实体的一些属性链接到文本框,但是当我尝试通过在文本框中键入来更新这些属性时,我遇到了困难。这是我的文本框和列表框的 xaml 代码:

 <TextBox Text="{Binding SaleTitle, ValidatesOnDataErrors=true, Mode=TwoWay}"
  <ListBox Height="424" 
        Margin="24,80,0,0"             
        x:Name="listBoxProperties"
        VerticalAlignment="Top" 
        ItemTemplate="{StaticResource propertySummaryTemplate}"
        IsSynchronizedWithCurrentItem="True"  
        Width="216" BorderThickness="0" Background="{x:Null}"
        FontFamily="Segoe UI" 
        ItemsSource="{Binding PropertyList}"
        SelectedItem="{Binding CurrentProperty, Mode=TwoWay}"
        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
        UseLayoutRounding="True" 
        HorizontalAlignment="Left" 
        ScrollViewer.VerticalScrollBarVisibility="Disabled" >          
    </ListBox>

这是我的 MainViewModel 的部分代码:

   private string _SaleTitle;
    public string SaleTitle
    {
        get
        {
            if (CurrentProperty != null)
                return CurrentProperty.SaleTitle;
            else
                return "";
        }
        set
        {
            _SaleTitle = value;
            RaisePropertyChanged("SaleTitle");
        }
    }



              private RelayCommand loadCommand;
    public ICommand LoadCommand
    {
        get
        {
            if (loadCommand == null)
                loadCommand = new RelayCommand(() => Load());
            return loadCommand;
        }
    }
    private void Load()
    {
        PropertyList = new ObservableCollection<Property>((from property in entities.Properties.Include("Images")
                                                          select property));
        propertyView = CollectionViewSource.GetDefaultView(PropertyList);
        if (propertyView != null)
            propertyView.CurrentChanged += new System.EventHandler(propertyView_CurrentChanged);
        RaisePropertyChanged("CurrentContact");
        RaisePropertyChanged("SaleTitle");
        RaisePropertyChanged("Address");
        RaisePropertyChanged("AuctioneerName");
        RaisePropertyChanged("AgentName");
        RaisePropertyChanged("Price");
        RaisePropertyChanged("NextBid");
        RaisePropertyChanged("Status");
    }


        void propertyView_CurrentChanged(object sender, System.EventArgs e)
    {
        RaisePropertyChanged("CurrentContact");
        RaisePropertyChanged("SaleTitle");
        RaisePropertyChanged("Address");
        RaisePropertyChanged("AuctioneerName");
        RaisePropertyChanged("AgentName");
        RaisePropertyChanged("Price");
        RaisePropertyChanged("NextBid");
        RaisePropertyChanged("Status");
    }

    private Property _CurrentProperty;
    public Property CurrentProperty
    {
        get
        {
            if (propertyView != null)
                return propertyView.CurrentItem as Property;
            return null;
        }

        set
        {
            _CurrentProperty = value;
            RaisePropertyChanged("CurrentProperty");
        }
    }


     public ObservableCollection<Property> PropertyList
    {
        get
        {
            return propertyList;
        }

        set
        {
            if (propertyList == value)
            {
                return;
            }

            var oldValue = propertyList;
            propertyList = value;

            // Update bindings, no broadcast
            RaisePropertyChanged(PropertiesPropertyName);
        }
    }

    public MainViewModel()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            // Code runs "for real"
            entities = new Model1Container1();
        }
    }

    ////public override void Cleanup()
    ////{
    ////    // Clean up if needed

    ////    base.Cleanup();
    ////}
}

}

列表框已成功填充当前所选项目的内容,但当我输入它并单击它或执行任何操作以失去焦点时,它只会回到之前的状态。

【问题讨论】:

    标签: c# wpf entity-framework mvvm


    【解决方案1】:

    查看您的 SaleTitle 属性定义。它从 CurrentProperty.Saletitle 读取值,但将值设置为未在任何地方使用的本地字段。

    【讨论】:

    • 我发誓我已经试过了,简直不敢相信它是如此简单 - 一定是我连续 10 小时后在耍花招!
    猜你喜欢
    • 2014-05-04
    • 2017-07-13
    • 2023-03-15
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多