最初我把它发布到PRISM4论坛,但得到了我应该的建议 尝试这个论坛:)我正在使用WPF4 BTW ...
我正在运行PRISM4,我一直在努力让我的数据绑定工作。 我正在遵循MVVM模式并拥有最初加载的视图模型 来自RDBMS的数据并将其包装在ICollectionView中。这完美地工作,数据显示在绑定的DatGrid中,但是当我试图保持时,我正在努力工作 对在下面声明的DataGrid中显示的数据所做的更改。
视图模型通过读/写属性发布ICollectionView, “结果”,正如您所看到的那样具有“TwoWay”的绑定模式。我想 这足以坚持对状态的改变 复选框但没有:(我已经尝试了很多方法来实现 这个但复选框的状态不会传播回视图模型。 我拦截了对“PlotClicked”方法的调用,这是一个ICommand 对象,但传递的参数具有未更改的“Plot”属性! 当我单击其中一个列标题和。时,这一点尤为明显 视图已排序 - 未选中已选中的行,这是从数据库中检索时复选框的默认状态。
我在这里做错了什么?
非常感谢提前 - 我真的被困在这里:( /彼得
<DataGrid Grid.Row="0" Name="gridResults" ItemsSource="{Binding Results,Mode=TwoWay}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Plot">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Plot, Mode=TwoWay}"
HorizontalAlignment="Center"
Command="{Binding Path=DataContext.PlotClicked,Mode=OneWay, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
我尝试了向我指出的建议。这就是我所做的:
在视图模型中,我将Result属性从ICollectionView更改为OC
public ObservableCollection Results {get;组; }
为构成视图的UserControl添加了以下模板资源
在“列”部分
中将以下代码添加到DataGrid <DataGridTemplateColumn
Header="cbTest"
x:Name="cbTest"
CellTemplate="{StaticResource IsSelectedColumnTemplate}"
CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
CanUserSort="True"
Width="Auto"
/>
在进行了这些更改之后,我在IsChecked中对UpdateSourceTrigger的各种设置进行了实验=“{Binding提到...在上面的(2)中没有效果。我对复选框所做的更改不会转移回视图-model的ObservableCollection。
再一次,非常感谢你帮我解决这个问题!
*更新 * 现在我已经经历了一些非常棒的事情:(这就是我所做的:
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
这在某种意义上说不起作用,即通过单击DataGrid中的复选框列,“Plot属性”永远不能设置为true!现在我做了以下事情:
public class ResultViewResult : IReslutViewResult
{
private bool _plot;
public bool Plot
{
get
{
return _plot;
}
set
{
_plot = value;
}
}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
你可能会问的结果?它的工作原理和'Plot'设置正确!现在,我想,这很奇怪!所以我做的是以下(简单地注释掉私有var和get / set代码):
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
//private bool _plot = false;
//public bool Plot
//{
// get
// {
// return _plot;
// }
// set
// {
// _plot = value;
// }
//}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
好的,结果怎么样?有用!!!???我惊呆了...我的意思是第一个和最后一个区别的是什么?我对此感到非常尴尬 - 我的意思是我想知道这里幕后发生的事情...... :(
答案 0 :(得分:0)
不确定,但我建议您尝试使用ObservableCollection
作为ItemsSource
。我以前遇到过很多这样的问题,所有这些都是使用这种集合解决的(为了更新目的,它比经典集合更快,更少消耗)。
另外,尝试添加以下IsChecked
绑定:UpdateSourceTrigger=PropertyChanged
,这可以解决问题,我认为这里唯一的问题是源不会在正确的时间更新!
答案 1 :(得分:0)
不确定这是否是您的问题,但DataGrid使用数据绑定的变体,在您离开行之前不会将更改提交到源。这称为BindingGroup。也许你没有看到提交的值,因为你还没有离开那行?
另一种可能性是绑定路径以某种方式不正确?您是否检查过VS中的输出窗口以查看它是否报告了任何绑定路径故障?