【问题标题】:Binding update problem绑定更新问题
【发布时间】:2011-07-24 17:54:08
【问题描述】:

绑定属性更改时绑定更新出现问题。 看看下面的代码。我将在以下示例中解释我的问题。

public class SettingsControl : INotifyPropertyChanged
    {

        string _value = "test";

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

        public SettingsControl() { }


     public string Value
        {
            get { return _value; }
            set { _value = value; OnPropertyChanged("Value"); }
        }
    }

<local:SettingsControl x:Key="Settings"></local:SettingsControl>

<TextBox Height="72" Text="{Binding Value, Mode=TwoWay, Source={StaticResource Settings} }"/>
<TextBlock Text="{Binding Value, Mode=OneWay, Source={StaticResource Settings} }" VerticalAlignment="Top" Width="135" />
<Button Height="100" Click="button1_Click" />

和后面的代码:

private void button1_Click(object sender, RoutedEventArgs e)
    {
        SettingsControl settings = new SettingsControl();
        settings.Value = "new value";
    }

现在,当我更改 TextBox 中的文本时,一切正常。新文本显示在 TextBlock 中。 但是,如果我将代码中的新文本设置为 settings.Value,则不会发生任何事情。

为了更改代码中的settings.Value 并影响TextBlock 中的TextProperty,我应该做些什么。

编辑:以下针对与我有相同问题的人的解决方案:

    SettingsControl settings = (SettingsControl)this.Resources["Settings"];
    settings.Value = "new value";

【问题讨论】:

    标签: c# silverlight windows-phone-7 binding


    【解决方案1】:

    在您的代码中,您是在新实例上设置值,而不是在正在使用的实例上。

    尝试将后面的代码更改为:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        // Set the Value on "this"
        this.Value = "new value";
    }
    

    话虽如此,“控件”上的属性通常是通过创建一个依赖属性来处理的,而不是通过INotifyPropertyChanged。这使得它们可以在 XAML 中正确设置和使用,并在更多场景中充分参与绑定。

    【讨论】:

    • 但我无法通过this.Value 联系到Value。我收到错误“'binding.MainPage' 不包含 'Value'... 的定义”。感谢您的建议,我会仔细研究依赖属性。
    • @Maku:在这种情况下,您需要获得对控件的正确引用——不要创建新实例,而是使用“this.mySettingsControl.Value”
    【解决方案2】:

    你应该尝试让 Mode=TwoWay ;-)

    【讨论】:

    • 在这个特定的例子中,我们当然可以这样做(Mode=TwoWay 和代码 TextBlock.Text = "new value")。我一直在寻找通用解决方案。感谢 Reed Copsey 问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多