簡體   English   中英

如何在WPF中綁定和刷新UserControl綁定?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM