首页 新闻 搜索 专区 学院

wpf DynamicListBase 自动保存对DataTemplate失效 无法修改后自动保存

0
悬赏园豆:100 [待解决问题]
<DataGridTemplateColumn Header="启用" Width=".8*">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsEnabled="{Binding AllowEdit, Mode=TwoWay}"
                                  IsChecked="{Binding IsInUse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                                        <CheckBox.Style>
                                            <Style TargetType="{x:Type CheckBox}">
                                                <Setter Property="Cursor"  Value="Hand" />
                                                <Setter Property="Template">
                                                    <Setter.Value>
                                                        <ControlTemplate TargetType="{x:Type CheckBox}">
                                                            <ContentPresenter RecognizesAccessKey="True"
                                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                           Margin="{TemplateBinding Padding}"                                                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                                            <ControlTemplate.Triggers>
                                                                <Trigger Property="IsChecked" Value="False">
                                                                    <Setter  Property="Opacity" Value="0.5" />
                                                                </Trigger>
                                                                <Trigger Property="IsEnabled" Value="False">
                                                                    <Setter Property="Foreground"
                                  Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                                                </Trigger>
                                                            </ControlTemplate.Triggers>
                                                        </ControlTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </Style>
                                        </CheckBox.Style>
                                        <CheckBox.Content>
                                            <Image x:Name="img"  Width="16" Height="16"
                                Source="{StaticResource Icon16_AcceptMark}" />
                                        </CheckBox.Content>
                                    </CheckBox>
                                    <DataTemplate.Triggers>
                                        <DataTrigger Binding="{Binding AllowEdit}" Value="0">
                                            <Setter Property="Source" Value="{StaticResource Icon16_NotAcceptMark}"
                                 TargetName="img" />
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding IsInUse}" Value="0">
                                            <Setter Property="Source" Value="{StaticResource Icon16_HideMark}"
                                 TargetName="img" />
                                        </DataTrigger>
                                    </DataTemplate.Triggers>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>


这是datagrid 里的一列

我model层用:

[Serializable]
public class SalaryItemList : DynamicListBase<SalaryItem>

我 viewmodel层用:

public class SalaryItemListModel : DynamicListViewModel<SalaryItemList, SalaryItem>

普通datagrid列修改一行后是可以自动保存的

但现在如上图用DataTemplate无法获得列数据所以无法自动保存

问题补充:

我用的是mvvm wpf页面 csla架构

梁娜的主页 梁娜 | 初学一级 | 园豆:39
提问于:2014-05-30 09:17
< >
分享
所有回答(1)
0

你的 DataGrid 所在窗体的 DataContext 是什么?

 

Launcher | 园豆:45045 (高人七级) | 2014-05-30 10:03

DataContext是

<ui:Module.DataContext>
   <vm:SalaryAccountModel />
</ui:Module.DataContext>

我的模型继承的是一个DynamicListBase,这意味着只要用户修改DataGrid中的一条线,DataPortal_Update会被自动调用

但是,这并不工作,对具有一个DataTemplate DataGrid列

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-05-30 11:45

DataContext是

<ui:Module.DataContext>
   <vm:SalaryAccountModel />
</ui:Module.DataContext>

我的模型继承的是一个DynamicListBase,这意味着只要用户修改DataGrid中的一条线,DataPortal_Update会被自动调用

但是,这并不工作,对具有一个DataTemplate DataGrid列

public class SalaryAccountModel:CollectionViewModel
    {
        #region Models
        public SalaryItemEditModel SalaryItemEditModel { get; private set; }
        #region Methods

        public SalaryAccountModel()
            : base(typeof(SalaryAccountModel))
        {
            SalaryAccountEditModel = new SalaryAccountEditModel();
            SalaryItemEditModel = new SalaryItemEditModel();
            SalaryFormulaEditModel = new SalaryFormulaEditModel(SalaryItemEditModel);
        }

        public override void Init()
        {
            base.Init();

            SalaryItemEdit salaryItemEdit = new SalaryItemEdit();
            salaryItemEdit.DataContext = SalaryItemEditModel;
            ViewDict.Add(View.SalaryItemEdit, salaryItemEdit);

            IsInit = true;

            CurrentView = View.salaryAccountAdd;
        }

        #endregion
    }
支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-05-30 11:49

@梁娜: 你的 DataGrid 的 ItemsSouce 的 Binding 是啥?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-05-30 13:45

@Launcher: ItemsSource="{Binding SalaryItemView}"

        private ListCollectionView _SalaryItemView;
        public ListCollectionView SalaryItemView
        {
            get { return _SalaryItemView; }
            set { _SalaryItemView = value; OnPropertyChanged("SalaryItemView"); }
        }

除了启用这一列 其他普通列是可以保存的

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 09:10

@梁娜: <CheckBox IsEnabled="{Binding AllowEdit, Mode=TwoWay}"
                                  IsChecked="{Binding IsInUse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

这里有两个绑定,你指的是哪个绑定不可以保存?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-03 09:18

@Launcher: IsChecked="{Binding IsInUse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">这个绑定

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 09:31

@梁娜: 这个绑定单向能生效吗?也就是说设置 IsInUse 属性为 False,CheckBox 会显示未选中吗?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-03 09:34

@Launcher: 会的 点击CheckBox 页面会显示选中和未选中,就是不能保存

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 10:00

@梁娜: 

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 10:01

@梁娜: 

每修改一个单元格数据 都会自动触发 List_Saved 方法,但是修改 ‘启用’ 这一列的时候,不会触发List_Saved方法 我觉着是DataTemplate 和 DynamicListBase不兼容 但我又不会改

SalaryItemList.Saved += new System.EventHandler<Csla.Core.SavedEventArgs>(List_Saved);

 

private void List_Saved(object sender, Csla.Core.SavedEventArgs e)
        {
            if (e.Error != null)
                throw e.Error;
        }

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 10:09

@梁娜: 不是点击,是在代码中设置 ViewModel 的 IsInUse 属性为 False。你可以在你的 ViewModel 上设置一个断点,如下:

public class xxxViewModel

{

     public bool IsInUse

{

    get {return _isInUse;} // 这里设置一个断点

    set { _isInUse = value;}  // 这里设置一个断点

}

}

在 UI 上点击 CheckBox 后,换一行选中。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-03 10:10

@Launcher: IsInUse 是数据库里的一个值, SalaryItem对象里的一个字段,能 这样写吗?

输出里会报这样的错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'Use' property not found on 'object' ''SalaryItem' (HashCode=66710041)'. BindingExpression:Path=Use; DataItem='SalaryItem' (HashCode=66710041); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')

public class xxxViewModel

{

     public bool IsInUse

{

    get {return _isInUse;} // 这里设置一个断点

    set { _isInUse = value;}  // 这里设置一个断点

}

}

数据库里改变isInUse 页面是可以改变的

支持(0) 反对(0) 梁娜 | 园豆:39 (初学一级) | 2014-06-03 10:27

@梁娜: 把你的 SalaryItem 贴出来

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-03 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册