【发布时间】:2014-09-27 20:35:08
【问题描述】:
我感觉这是 wpf 中的一个错误。让我知道你们对此的看法。
为了简单起见,我在 .net 4.0 中做了演示示例
我有一个 ContentControl,其 Content 绑定到 Data 和 ContentTemplate,其中包含一个 CheckBox 绑定到 Content。
问题是无论我多久点击一次复选框,Ok 属性都不会为真。
好像 CheckBox 没有将新值传递给 ViewModel。
看看这个:
<Window.Resources>
<DataTemplate x:Key="dataTemplate">
<CheckBox IsChecked="{Binding Path=., Mode=TwoWay}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding Path=Ok, Mode=TwoWay}" ContentTemplate="{StaticResource dataTemplate}"/>
</Grid>
这是我的视图模型
public MainWindow()
{
InitializeComponent();
ViewModel vm = new ViewModel();
this.DataContext = vm;
}
public class ViewModel : INotifyPropertyChanged
{
private string txt;
public string Txt
{
get { return txt; }
set { txt = value; this.OnPropertyChanged("Txt"); }
}
private bool ok;
public bool Ok
{
get { return ok; }
set { ok = value; this.OnPropertyChanged("Ok");}
}
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
任何想法如何使用 ContentTemplate 解决此问题?
【问题讨论】:
-
如果您将 datatemplate 更改为 controltemplate 并将 contentcontrols 模板属性绑定到 controltemplate,我认为 datacontext 将被保留。在您的情况下,数据上下文似乎没有保留
-
嗯,我不能那样做。这只是一个演示。它表明 ContentTemplate 通常存在错误。我什么都改变不了!我必须坚持 ContentTemplate。还有其他方法吗?
-
我很确定这不是 WPF 错误。您是否在调试输出中看到任何绑定错误?
-
MSDN: Binding Declarations Overview 表示可选,句点 (.) 路径可用于绑定到当前源。例如,Text="{Binding}" 等价于 Text="{Binding Path=.}"。
-
@DanPuzey 我的意思是,如果有问题的代码
IsChecked="{Binding Path=.}"写成IsChecked="{Binding}"会失败,因为双向绑定需要定义路径或 xpath。但是通过设置Path=.验证/警告被抑制,导致这种行为