<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无法获得列数据所以无法自动保存
你的 DataGrid 所在窗体的 DataContext 是什么?
DataContext是
<ui:Module.DataContext>
<vm:SalaryAccountModel />
</ui:Module.DataContext>
我的模型继承的是一个DynamicListBase,这意味着只要用户修改DataGrid中的一条线,DataPortal_Update会被自动调用
但是,这并不工作,对具有一个DataTemplate DataGrid列
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 }
@梁娜: 你的 DataGrid 的 ItemsSouce 的 Binding 是啥?
@Launcher: ItemsSource="{Binding SalaryItemView}"
private ListCollectionView _SalaryItemView;
public ListCollectionView SalaryItemView
{
get { return _SalaryItemView; }
set { _SalaryItemView = value; OnPropertyChanged("SalaryItemView"); }
}
除了启用这一列 其他普通列是可以保存的
@梁娜: <CheckBox IsEnabled="{Binding AllowEdit, Mode=TwoWay}"
IsChecked="{Binding IsInUse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
这里有两个绑定,你指的是哪个绑定不可以保存?
@Launcher: IsChecked="{Binding IsInUse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">这个绑定
@梁娜: 这个绑定单向能生效吗?也就是说设置 IsInUse 属性为 False,CheckBox 会显示未选中吗?
@Launcher: 会的 点击CheckBox 页面会显示选中和未选中,就是不能保存
@梁娜:
@梁娜:
每修改一个单元格数据 都会自动触发 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;
}
@梁娜: 不是点击,是在代码中设置 ViewModel 的 IsInUse 属性为 False。你可以在你的 ViewModel 上设置一个断点,如下:
public class xxxViewModel
{
public bool IsInUse
{
get {return _isInUse;} // 这里设置一个断点
set { _isInUse = value;} // 这里设置一个断点
}
}
在 UI 上点击 CheckBox 后,换一行选中。
@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 页面是可以改变的
@梁娜: 把你的 SalaryItem 贴出来