我正在尝试为用户控件做一个简单的OneWay绑定,但是老实说,我不明白为什么某些部分无法正常工作。为简单起见,我创建了具有某些依赖项属性的WPF标准UserControl。在主窗口中,根据某些事件隐藏/显示UserControl,并将属性绑定到主窗口viewmodel数据。但是,这样做不会使我的UserControl刷新某些零件。例如,我在UserControl上具有SearchString依赖项属性:
public static readonly DependencyProperty SearchStringProperty = DependencyProperty.Register("SearchString",
typeof(string), typeof(DisplayMailView), new UIPropertyMetadata(null));
public string SearchString
{
get { return (string)GetValue(SearchStringProperty); }
set
{
SetValue(SearchStringProperty, value);
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("SearchString"));
}
var loFinds = richEditControl1.Document.FindAll(SearchString, SearchOptions.WholeWord);
foreach (var find in loFinds)
{
var oDoc = find.BeginUpdateDocument();
var oChars = oDoc.BeginUpdateCharacters(find);
oChars.BackColor = System.Drawing.Color.Yellow;
oDoc.EndUpdateCharacters(oChars);
find.EndUpdateDocument(oDoc);
}
}
}
UserControl中的这一行绑定到我的主Window视图模型的SearchString成员
<local:DisplayMailView SearchString="{Binding DataContext.SearchString, RelativeSource={RelativeSource AncestorType={x:Type Window}}, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True,NotifyOnTargetUpdated=True,Mode=TwoWay}"/>
在我的ViewModel上:
public string SearchString
{
get
{
return _searchString;
}
set
{
_searchString = value;
if (!string.IsNullOrWhiteSpace(value))
DataGridService.FocusFirstRow();
RaisePropertyChanged();
}
}
我在主窗口viewmodel的SearchString集合中设置了一个断点,该值已设置。但是,当我在UserControl的SearchString集合中设置断点时,它永远不会触发?
另外,我的UserControl的dataContext设置为:
(this.Content as FrameworkElement).DataContext = this;
我精确地说,我的UserControl构造函数仅在启动时被调用一次,而其他内容则必须根据用户操作动态刷新。
有人有主意吗?我在输出窗口中没有错误,谢谢
这是一个普遍的误解。当DependencyProperty的值更改时,set
不会执行其CLR属性中的代码。如果要在属性值更改时执行一些代码,则需要使用PropertyChanged回调。
您的UserControl代码应如下所示:
public static readonly DependencyProperty SearchStringProperty =
DependencyProperty.Register(
"SearchString",
typeof(string),
typeof(DisplayMailView),
new UIPropertyMetadata(null, OnSearchStringChanged));
// This sets OnSearchStringChanged as the PropertyChanged callback
public string SearchString
{
get { return (string)GetValue(SearchStringProperty); }
set
{
SetValue(SearchStringProperty, value);
// Any code you put here won't be executed
// when the DependencyProperty value changes
}
}
private static void OnSearchStringChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// This part is not needed, DependencyProperties already
// notify of their changes automatically
//if (PropertyChanged != null)
//{
// PropertyChanged(this, new PropertyChangedEventArgs("SearchString"));
//}
var control = sender as DisplayMailView;
var loFinds = control.richEditControl1.Document.FindAll(SearchString, SearchOptions.WholeWord);
foreach (var find in loFinds)
{
var oDoc = find.BeginUpdateDocument();
var oChars = oDoc.BeginUpdateCharacters(find);
oChars.BackColor = System.Drawing.Color.Yellow;
oDoc.EndUpdateCharacters(oChars);
find.EndUpdateDocument(oDoc);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句