【问题标题】:XAML binding silverlightXAML 绑定 silverlight
【发布时间】:2011-09-14 15:43:49
【问题描述】:

我有一个如下定义的用户控件:

<UserControl ...
......
x:name="StartPage">

<ToggleButton  
x:Name="FullScreenToggle" 
Content="{Binding ElementName=StartPage,Path=FullScreenState,Mode=OneWay}" />

</UserControl>

在后面的代码中:

public String FullScreenState
{
            get;
            set;
}

但是,由于某种原因,ToggleButton 的 Content 属性没有获取该属性。 有任何想法吗?

【问题讨论】:

  • +1 表示可以将元素绑定到您的代码后面:)
  • 效果如何? IMO,这不能那样工作。因为在呈现 UserControl 时,您不能在不存在的对象上绑定属性。

标签: silverlight xaml binding


【解决方案1】:

您的绑定完全有效,但您需要使用可更新的属性,否则视图将不会收到属性更改的通知。

基本上它需要使用更改的属性的详细信息调用 PropertyChanged:

private string _fullScreenState;
public string FullScreenState
{
    get { return _fullScreenState; }
    set
    {
        if (_fullScreenState != value)
        {
            _fullScreenState = value;
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("FullScreenState"));
            }
        }
    }
}

这意味着你的控件必须实现 INotifyPropertyChanged:

public partial class SilverlightControl1 : UserControl, INotifyPropertyChanged

并提供事件处理程序:

public event PropertyChangedEventHandler PropertyChanged;

*如 tam 所述,如果您想扩展您的控件以在其他控件中使用,您也可以使用依赖属性。课程用马:)

【讨论】:

  • 对象状态尚未创建。在创建ctor之前怎么可能?您正在绑定到一个不存在的对象。有可能吗?
  • @Davut Gürbüz:请解释一下你在说什么?构造一个空对象,因为 XAML 被解析,之前它的值从 XAML 内容序列化。
【解决方案2】:

您还可以将您的属性定义为依赖属性,这将使您能够灵活地稍后在更大的控件中绑定到它

例如:

    public int MyProperty
    {
        get { return (int)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new UIPropertyMetadata(0));

【讨论】:

    【解决方案3】:

    您必须设置 UserControl 的 DataContext:

    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    

    我相信您还必须从绑定语句中删除“ElementName”属性。 然后,您应该能够绑定到后面代码中的属性。

    【讨论】:

    • 元素绑定到 StartPage 控件本身是完全有效的并且可以工作。他只是忘了使用可更新的属性。不过我喜欢你的绑定示例。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-04-23
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多