[英]How to bind and refresh UserControl binding in WPF?
我正在嘗試為用戶控件做一個簡單的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的值更改時,不會執行其CLR屬性set
的代碼。 如果要在屬性值更改時執行一些代碼,則需要使用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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.