Silverlight 数据形式 MVVM 命令绑定(bind)更新

标签 silverlight silverlight-3.0 mvvm mvvm-light dataform

我是 MVVM 和 Silverlight 的新手,我只是想找出一个简单的场景。

我使用的是 MVVM Light 工具包和 Silverlight 3.0,没有使用 Expression Blend。

我有一个 DataGrid 和一个 DataForm 绑定(bind)到 ViewModel 中的可观察集合。我想绑定(bind)到我的RelayCommand Save()在我对 DataForm 控件中的数据进行更改并在不使用 View 后面的代码的情况下完成此操作后,属性。

DataForm 不使用 cmd:ButtonBaseExtensions.Command MVVM Light 用于普通按钮单击命令绑定(bind),因此我不确定如何将控件绑定(bind)到我的 ViewModel。

感谢任何帮助!

最佳答案

我在发布问题后不久就弄清楚了。想想吧。

使用 MVVM Light Toolkit 时,您可以使用 EventToCommand 功能绑定(bind)到事件。

我的 Xaml 看起来像这样:

<UserControl x:Class="CountyBusinessDirectory.UI.MainPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
         xmlns:dataFormToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"  
         xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
         xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight"
         xmlns:cmdextras="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
         DataContext="{Binding BusinessesViewModel, Source={StaticResource Locator}}">
<Grid x:Name="LayoutRoot" ShowGridLines="False">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <data:DataGrid x:Name="dgAllBusinesses" CanUserSortColumns="True" 
                   IsReadOnly="True" AutoGenerateColumns="True" 
                   ItemsSource="{Binding Businesses}" 
                   Grid.Column="0">
    </data:DataGrid>
    <ScrollViewer x:Name="svScroll" Grid.Column="1" >
        <dataFormToolkit:DataForm x:Name="dfDetails"
                                  ItemsSource="{Binding Businesses}"
                                  AutoGenerateFields="True" 
                                  CommitButtonContent="Save" 
                                  CommandButtonsVisibility="Edit, Navigation, Commit, Cancel" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="EditEnded">
                    <cmdextras:EventToCommand Command="{Binding SaveBusiness}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </dataFormToolkit:DataForm>
    </ScrollViewer>
</Grid>

我的 ViewModel 看起来像这样(在 ViewModel 中使用直接 silverlight 启用的 WCF 服务作为快速示例,通常会将其拉入接口(interface)中以解耦):

//using statements ommitted for brevity

namespace MyProject.ViewModels
{
    public class BusinessesViewModel : ViewModelBase
    {
        private PagedCollectionView _businesses;
        DALServiceClient _proxy;

        public RelayCommand SaveBusiness
        { get; private set; }

        public PagedCollectionView Businesses
        {
            get
            {
                return _businesses;
            }
            set
            {
                if (_businesses != value)
                {
                    _businesses = value;

                    base.RaisePropertyChanged("Businesses");
                }
            }
        }

        public BusinessesViewModel()
        {
            _proxy = new DALServiceClient(); //Data Access Layer WCF Service

            _proxy.GetBusinessesCompleted += new EventHandler<GetBusinessesCompletedEventArgs>(_proxy_GetBusinessesCompleted);
            _proxy.GetBusinessesAsync();

            SaveBusiness = new RelayCommand(() => SaveBusinessToDB());
        }

        private void SaveBusinessToDB()
        {
            Business bus = Businesses.CurrentItem as Business;
            _proxy.UpdateBusinessesAsync(bus);
        }

        void _proxy_GetBusinessesCompleted(object sender, GetBusinessesCompletedEventArgs e)
        {
            if (e.Result != null)
            {
                Businesses = new PagedCollectionView(e.Result);
            }
        }
    }
}

关于Silverlight 数据形式 MVVM 命令绑定(bind)更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990336/

相关文章:

wpf - 来自源的背景图像数据绑定(bind)不起作用

c# - Silverlight XAML 对象的二进制序列化

Silverlight OOTB 支持 'Save File' 浏览器对话框

c# - 将集合绑定(bind)到 StackPanel

Silverlight 使用 HTTPS 轮询双工

c# - FrameworkElement 的 VisualStateManager.GoToState

c# - Silverlight DataGrid 中的选定项

具有自动宽度和高度的 Silverlight 网格

c# - WPF TreeView : Skip a Level

java - 何时使用 BindingAdapter,何时使用 MVVM 中的 liveData 或 observable 字段?