gpt4 book ai didi

c# - MVVM UserControl 绑定(bind)没有被推回到父控件

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:45 24 4
gpt4 key购买 nike

我正在制作一个 WPF 应用程序,我有一个用于数据编辑的 UserControl,里面还有几个 UserControl( super 简化版):

<UserControl x:Name="ParentControlView">
<DockPanel>
<!-- other various controls, textblocks, etc. -->
<Controls:DatePickerView DataContext="{Binding Path=EndDate, Mode=TwoWay}" />
<!-- other various controls, textblocks, etc. -->
</DockPanel>
</UserControl>

在父控件的 ViewModel 中,它有一个名为 EndDate 的子 DatePickerViewModel 绑定(bind)到 DatePickerView 控件:

public class ParentControlViewModel : ViewModelBase
{
private DatePickerViewModel _endDate;

public DatePickerViewModel EndDate
{
get { return _endDate; }
set
{
_endDate = value;
RaisePropertyChanged(() => EndDate);
RaisePropertyChanged(() => SomeProperty);
}
}
}

DatePickerView 控件是一些组合框,它们绑定(bind)到 DatePickerViewModel 中的属性,没什么特别的。

当我运行我的应用程序时,DatePickerView 被正确初始化并设置为当前值,就像它应该的那样。 所以 get 方法工作正常。但是当我更改 DatePickerView 上的控件并且它的 ViewModel 得到更新时,绑定(bind)到父级的值 View 未在父 View 模型中设置(即 set 方法从不运行)。

显然,我遗漏了某种数据绑定(bind)连接,但我终究无法弄清楚那是什么,而且我到处搜索,但一无所获。

更新

Minimal working sample .包括我正在使用的大部分专有日期类,可能还有一些糟糕的 MVVM 实现。我还是 MVVM 的新手。我去掉了很多不必要的代码,所以日期选择器不能正常工作,但它做了它需要为这个问题做的事情。

您需要获取并引用 MvvmFoundation.Wpf.dll ( at codeplex )。

最佳答案

唯一有意义的事情(仅基于显示的代码)是 (1) ViewModelBase 没有实现 INotifyPropertyChanged 或 (2) 您的 DatePickerView 控件在依赖属性方面做错了。

我建议发布完整的重现,包括 DataPickerView 和 ViewModelBase。

编辑

好的,看了一下,发现问题了。你的 setter 永远不会被调用的原因是你的 EndDate (DatePickerViewModel) 永远不会改变。这听起来有些不言自明,但这是底线——没有代码可以完全替换 EndDate 属性,这将导致 setter 代码运行。

您的下拉列表会更改 EndDate/DatePickerViewModel 的属性,但请记住,更改其属性(Date、SelectedYear 等)不会设置实例 DatePickerViewModel,这意味着 setter 代码将不会运行。

因为这是一个精简版,我有点猜测你最终想要实现什么,但我认为你想要的是在 DatePickerViewModel(可能是 DateTime 类型)上创建一个 DependencyProperty,它可以绑定(bind)到并且可以在控件内的日期更改时发出通知。

作为一种快速的解决方法,添加下面的代码来触发 setter 代码。请注意,这不是推荐的解决方案——它会导致您的 parent 和 child 相互引用,这(至少)很奇怪:

//in ParentControlViewModel, change your EndDate to:
public DatePickerViewModel EndDate
{
get { return _endDate; }
set
{
_endDate = value;
if (_endDate.ParentControlViewModel == null)
{
_endDate.ParentControlViewModel = this;
}
RaisePropertyChanged(() => EndDate);
}
}

//Add to DatePickerViewModel
public ParentControlViewModel ParentControlViewModel { get; set; }

//Change Date property in DatePickerViewModel to:
public GDate Date
{
get { return _date; }
set
{
_date = value;
RaisePropertyChanged(() => Date);
if (ParentControlViewModel != null)
{
ParentControlViewModel.EndDate = this;
}
}
}

关于c# - MVVM UserControl 绑定(bind)没有被推回到父控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com