簡體   English   中英

WPF文本框UpdateSourceTrigger不會更新源

[英]Wpf Textbox UpdateSourceTrigger doesn't update the source

我有一個帶有文本框的簡單窗口

XAML

<Window x:Class="Configurator.ConfiguratorWindow"
    x:Name="ConfigWindow" DataContext="{Binding RelativeSource={RelativeSource Self}}">

<TextBox x:Name="DescriptionTextBox" Text="{Binding Path=Description, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

</Window>

在后面的代碼中

public partial class ConfiguratorWindow : Window
{
    public ConfiguratorWindow()
        {
            InitializeComponent();
        }

    private static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(ConfiguratorWindow), new PropertyMetadata());

    public string Description
        {
            get { return GetValue(DescriptionProperty).ToString(); }
            set {
                    SetValue(DescriptionProperty, value);
                    _actual_monitor.Description = value;
                }
        }
}

圖形正在正確更新,但是當我更改文本框中的文本並失去焦點時,它不會更新source屬性。

怎么了?

DependencyProperties用於UserControls,而不是ViewModel類型綁定。

你應該

  1. 創建一個ConfigurationWindowViewModel(了解MVVM )並實現INotifyPropertyChanged

  2. 創建一個使用INotifyPropertyChanged的屬性描述

  3. 創建該視圖模型的新實例,以將其設置為ConfigurationWindow的DataContext。

依賴項屬性的CLR包裝器的getter和setter不得包含GetValue和SetValue以外的任何其他代碼。 MSDN上的XAML加載和依賴項屬性文章中對此原因進行了說明。

因此,刪除_actual_monitor.Description = value; 從設置器分配並添加PropertyChangedCallback以對屬性值更改做出反應:

public partial class ConfiguratorWindow : Window
{
    public ConfiguratorWindow()
    {
        InitializeComponent();
    }

    private static DependencyProperty DescriptionProperty = DependencyProperty.Register(
        "Description", typeof(string), typeof(ConfiguratorWindow),
        new PropertyMetadata(DescriptionPropertyChanged));

    public string Description
    {
        get { return (string)GetValue(DescriptionProperty); }
        set { SetValue(DescriptionProperty, value); }
    }

    private static void DescriptionPropertyChanged(
        DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ConfiguratorWindow obj = d as ConfiguratorWindow;
        obj._actual_monitor.Text = (string)e.newValue;
    }
}

嘗試這個

<Window x:Class="Configurator.ConfiguratorWindow"
         xmlns:myWindow="clr-namespace:YourNamespace"
x:Name="ConfigWindow" DataContext="{Binding RelativeSource={RelativeSource Self}}">

<TextBox x:Name="DescriptionTextBox" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type myWindow}}, Path=Description, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

public partial class ConfiguratorWindow : Window
{
public ConfiguratorWindow()
    {
        InitializeComponent();
    }

private static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(ConfiguratorWindow), new PropertyMetadata(null, CallBack);

 private static void callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var foo = d as ConfiguratorWindow ;
       all you need to do, you can do here
    }

public string Description
    {
        get { return GetValue(DescriptionProperty).ToString(); }
        set { SetValue(DescriptionProperty, value);}
    }
}

但是,只有一個View Model並綁定到那里的屬性會容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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