【问题标题】:WPF - Observable Collection new record from xml bindingWPF - 来自 xml 绑定的 Observable Collection 新记录
【发布时间】:2013-03-10 11:37:12
【问题描述】:

我有一个带有 tabcontrol 的页面。

我正在控件中绑定一个 tabitem 的位置列表。

记录在列表视图中列出。

我可以通过将输入控件绑定到 listview.selecteditem 来编辑记录。

我的问题是当我想添加新记录时。我想尽量减少后面的代码。

视图模型:

private ObservableCollection<LocationViewModel> _locations;

    public ObservableCollection<LocationViewModel> Locations
    {
        get { return _locations; }
    }

    public LocationListViewModel()
    {
        _locations = new ObservableCollection<LocationViewModel>();

        foreach (Service.Location l in service.GetLocationList().OrderBy(l => l.Building).ThenBy(l => l.Floor))
        {
            _locations.Add(new LocationViewModel
                                {
                                    id = l.id,
                                    Building = l.Building,
                                    Floor = l.Floor,
                                    RoomNo = l.RoomNo,
                                    MapTitle = l.MapTitle,
                                    MapExtension = l.MapExtension,
                                    Map = l.Map,
                                    DateCreated = l.DateCreated,
                                    CreatedByID = l.CreatedByID,
                                    CreatedByDesc = l.CreatedByDesc,
                                    DateEdited = l.DateEdited,
                                    EditedByID = l.EditedByID,
                                    EditedByDesc = l.EditedByDesc
                                }
                            );
        }
    }

XML:

<TabItem x:Name="tabSettingsLocations" x:Uid="tabSettingsLocations" 
    Header="Locations"
    DataContext="{StaticResource ResourceKey=LocationList}"> .....

成功绑定到列表视图以进行编辑的示例

<TextBox x:Name="txtSettingLocationBuildingEdit" 
    Margin="90,17,0,0" Style="{DynamicResource SettingsTextBoxStyle}"
    Text="{Binding SelectedItem.Building, ElementName=lvwSettingsLocations,
    Mode=TwoWay}" />

新记录绑定失败示例(使用不同的输入控件集)

<TextBox x:Name="txtSettingLocationBuildingAdd"  
    Margin="90,17,0,0" Style="{DynamicResource SettingsTextBoxStyle}" 
    Text="{Binding Building, ElementName=lvwSettingsLocations, 
    Mode=OneWayToSource}"/>

我也尝试将子标签项绑定到同一个数据源

<TabItem x:Name="tbSettingsLocationsAdd" x:Uid="tbSettingsLocationsAdd" 
    Header="Add New"
    DataContext="{StaticResource ResourceKey=LocationList}">

<TextBox x:Name="txtSettingLocationBuildingAdd"  
    Margin="90,17,0,0" Style="{DynamicResource SettingsTextBoxStyle}" 
    Text="{Binding Building}"/>

无济于事。

我也尝试创建一个新的子数据视图,但我希望将它们全部绑定在一起,以便界面更新我添加或编辑的任何内容。

有人帮忙吗?

【问题讨论】:

  • 你设置了dataContext了吗?
  • 目前还不清楚问题出在哪里,您正在谈论成功和不成功的绑定,但您声明要最小化“添加”方法的代码隐藏。至少您不应该这样做Text="{Binding SelectedItem.Building, ElementName=lvwSettingsLocations, Mode=TwoWay}",而是将以下内容添加到TextBoxDataContext="{Binding SelectedItem, ElementName=lvwSettingsLocations}" Text="{Binding Path=Building}" Binding 在属性上效果很好,而不是在“子属性”上,至少对于这种方式的属性属性来说效果很差。
  • 我听取了您的建议并重新构建了绑定。然而,它并不能解决新的进入问题。问题是新的位置视图模型不存在。看来我需要使用 observablecollection.add 在后面的代码中添加。

标签: wpf data-binding observablecollection


【解决方案1】:

好的,所以我最终确定了这一点。只是想分享...感谢 Silvermind 提供的最佳实践建议。

命令:

class Location_Add : ICommand
{
    private ObservableCollection<LocationViewModel> _llvm;

    public ObservableCollection<LocationViewModel> llvm
    {
        get { return _llvm; }
    }

    public Location_Add(ObservableCollection<LocationViewModel> passedllvm)
    {
        _llvm = passedllvm;
    }

    public bool CanExecute(object parameter)
    {
        LocationViewModel lvw = parameter as LocationViewModel;
        return lvw != null;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
            LocationViewModel lvm = parameter as LocationViewModel;
            llvm.Add(lvm);
            AddLocation(lvm);
    }

    public void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }

    public void AddLocation(LocationViewModel lvm)
    {
        try
        {
            Service.SchoolMonitorServiceClient service = new Service.SchoolMonitorServiceClient();

            Service.Location loc = new Service.Location();
            loc.Building = lvm.Building.Trim();
            loc.Floor = lvm.Floor.Trim();
            loc.RoomNo = lvm.RoomNo.Trim();
            loc.MapTitle = lvm.MapTitle;
            loc.MapExtension = lvm.MapTitle.Substring(lvm.MapTitle.IndexOf("."));
            loc.Map = lvm.Map;
            loc.DateCreated = DateTime.Now;
            loc.CreatedByID = (Int32)Application.Current.Resources["UserID"];
            loc.DateEdited = lvm.DateEdited;

            service.AddLocation(loc);
            MessageBox.Show("Your new Location was entered successfully", "Success", MessageBoxButton.OK);
        }
        catch (Exception e)
        {
            .....
        }
    }
}

视图模型:

class LocationListViewModel
{
    Service.SchoolMonitorServiceClient service = new Service.SchoolMonitorServiceClient();

    #region Members

    private ObservableCollection<LocationViewModel> _locations;
    private Location_Add _AddCommand;

    #endregion

    #region Properties

    public ObservableCollection<LocationViewModel> Locations
    {
        get { return _locations; }
    }

    #endregion

    public LocationListViewModel()
    {
        _locations = new ObservableCollection<LocationViewModel>();

        foreach (Service.Location l 
            in service.GetLocationList()
            .OrderBy(l => l.Building).ThenBy(l => l.Floor))
        {
            _locations.Add(new LocationViewModel
                                {
                                    id = l.id,
                                    Building = l.Building,
                                    Floor = l.Floor,
                                    RoomNo = l.RoomNo,
                                    MapTitle = l.MapTitle,
                                    MapExtension = l.MapExtension,
                                    Map = l.Map,
                                    DateCreated = l.DateCreated,
                                    CreatedByID = l.CreatedByID,
                                    CreatedByDesc = l.CreatedByDesc,
                                    DateEdited = l.DateEdited,
                                    EditedByID = l.EditedByID,
                                    EditedByDesc = l.EditedByDesc
                                }
                            );
        }

        _AddCommand = new Location_Add(_locations);
    }

    public ICommand AddCommand
    {
        get
        {
            return _AddCommand;
        }
    }
}

XML:

xmlns:local="clr-namespace:SchoolMonitor_WPF.ViewModels"

<Page.Resources>
    <local:LocationListViewModel x:Key="LocationList" />
    <local:LocationViewModel x:Key="NewLocation" />
</Page.Resources>

<TextBox x:Name="txtSettingLocationBuildingAdd" x:Uid="txtSettingLocationBuildingAdd"  
    Margin="90,17,0,0" Style="{DynamicResource SettingsTextBoxStyle}"
    DataContext="{StaticResource ResourceKey=NewLocation}"
    Text="{Binding Path=Building}"/>

<Button x:Name="btnSettingsLocationSaveAdd" Content="Submit" Margin="0,80,10,0" 
    VerticalAlignment="Top" Style="{DynamicResource ButtonStyle}"
    HorizontalAlignment="Right" Width="75"
    DataContext="{StaticResource ResourceKey=LocationList}"
    CommandParameter="{StaticResource ResourceKey=NewLocation}" 
    Command="{Binding AddCommand}">

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2014-10-24
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多