首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Silverlight UserControl自定义属性绑定

Silverlight UserControl自定义属性绑定
EN

Stack Overflow用户
提问于 2009-10-06 16:46:27
回答 2查看 18.8K关注 0票数 16

在Silverlight UserControls中实现自定义属性的正确方法是什么?

从技术上讲,Silverlight中的每个“页面”都是一个UserControl (它们是从UserControl类派生的)。当我在这里说UserControl时,我指的是一个自定义的UserControl,它将在许多不同的情况下在许多不同的页面中使用(类似于ASP.NET UserControl)。

我希望自定义UserControl支持绑定,而不是依赖于它绑定到的属性的名称,使其始终保持不变。相反,我希望UserControl本身有一个属性,UserControl内部的控件绑定到该属性,UserControl外部的ViewModels也绑定到该属性。(请参考下面的示例)

UserControl中的绑定,MainPage中的绑定,我在MainPage和UserControl之间设置的绑定不起作用。特别是这一行:

代码语言:javascript
复制
<myUserControls:MyCustomUserControl x:Name="MyCustomControl2" 
    SelectedText="{Binding MainPageSelectedText, Mode=TwoWay}" 
    Width="200" Height="50" />

输出示例:

MainPage.xaml

代码语言:javascript
复制
<UserControl x:Class="SilverlightCustomUserControl.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:myUserControls="clr-namespace:SilverlightCustomUserControl"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
  <Canvas x:Name="LayoutRoot">
    <StackPanel Orientation="Vertical">
      <TextBlock Text="UserControl Binding:" Width="200"></TextBlock>
      <myUserControls:MyCustomUserControl x:Name="MyCustomControl2" SelectedText="{Binding MainPageSelectedText, Mode=TwoWay}" Width="200" Height="50" />
      <TextBlock Text="MainPage Binding:" Width="200"></TextBlock>
      <TextBox Text="{Binding MainPageSelectedText, Mode=TwoWay}" Width="200"></TextBox>
      <Border BorderBrush="Black" BorderThickness="1">
        <TextBlock Text="{Binding MainPageSelectedText}" Width="200" Height="24"></TextBlock>
      </Border>
    </StackPanel>
  </Canvas>
</UserControl>

MainPage.xaml.cs

代码语言:javascript
复制
namespace SilverlightCustomUserControl
{
 public partial class MainPage : UserControl, INotifyPropertyChanged
 {
  //NOTE: would probably be in a ViewModel
  public string MainPageSelectedText
  {
   get { return _MainPageSelectedText; }
   set
   {
    string myValue = value ?? String.Empty;
    if (_MainPageSelectedText != myValue)
    {
     _MainPageSelectedText = value;
     OnPropertyChanged("MainPageSelectedText");
    }
   }
  }
  private string _MainPageSelectedText;


  public MainPage()
  {
   InitializeComponent();
  }


  #region INotifyPropertyChanged Members

  public event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged(string name)
  {
   PropertyChangedEventHandler ph = this.PropertyChanged;

   if (ph != null)
    ph(this, new PropertyChangedEventArgs(name));
  }

  #endregion
 }
}

MyCustomUserControl.xaml

代码语言:javascript
复制
<UserControl
   x:Class="SilverlightCustomUserControl.MyCustomUserControl" 
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   DataContext="{Binding RelativeSource={RelativeSource Self}}">
  <Grid>
    <StackPanel>
      <TextBox Text="{Binding SelectedText, Mode=TwoWay}" />
      <Border BorderBrush="Black" BorderThickness="1">
        <TextBlock Text="{Binding SelectedText}" Height="24"></TextBlock>
      </Border>
    </StackPanel>
  </Grid>
</UserControl>

MyCustomUserControl.xaml.cs

代码语言:javascript
复制
namespace SilverlightCustomUserControl
{
 public partial class MyCustomUserControl : UserControl
 {
  public string SelectedText
  {
   get { return (string)GetValue(SelectedTextProperty); }
   set { SetValue(SelectedTextProperty, value); }
  }

  public static readonly DependencyProperty SelectedTextProperty =
    DependencyProperty.Register("SelectedText", typeof(string), typeof(MyCustomUserControl), new PropertyMetadata("", SelectedText_PropertyChangedCallback));


  public MyCustomUserControl()
  {
   InitializeComponent();
  }

  private static void SelectedText_PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
   //empty
  }
 }
}

参考(我是如何走到这一步的):

使用DependencyPropertys:http://geekswithblogs.net/thibbard/archive/2008/04/22/wpf-custom-control-dependency-property-gotcha.aspx

使用DependencyPropertys,将x:Name添加到您的UserControl -使用ElementName添加绑定,在PropertyChangedCallback方法中再次设置自定义属性:Setting Custom Properties in UserControl via DataBinding

不要使用自定义属性,而要依赖底层的数据上下文名称(我不喜欢这个解决方案):wpf trouble using dependency properties in a UserControl

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-09 07:55:05

我的理解是,您的控件没有从主页面接收到新值的原因是您正在设置控件的DataContext。如果您没有这样做,那么控件的DataContext将从它的父级继承,本例中是主页。

为此,我删除了控件的名称设置,为每个控件添加了x: DataContext,并使用name.SetBinding方法在控件的构造函数中设置了绑定。

我在ctor中进行了绑定,因为我找不到将xaml中声明性绑定的Source属性设置为Self的方法。也就是说,{绑定SelectedText,Mode=TwoWay,Source=Self这里有一些方法}。我确实尝试过使用RelativeSource={RelativeSource Self},但没有任何乐趣。

注意:所有这些都是SL3。

票数 7
EN

Stack Overflow用户

发布于 2014-03-10 12:12:34

您可以在xaml中设置绑定,方法是为用户控件添加一个x:Name,然后在下面的用户控件中绑定,而不是将数据上下文绑定到自身:

代码语言:javascript
复制
<UserControl
  x:Class="SilverlightCustomUserControl.MyCustomUserControl" 
  x:Name="myUserControl
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding SelectedText, ElementName=myUserContol, Mode=TwoWay}" />
            <Border BorderBrush="Black" BorderThickness="1">
                <TextBlock Text="{Binding SelectedText,ElementName=myUserControl}" Height="24"></TextBlock>
            </Border>
        </StackPanel>
     </Grid>
</UserControl>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1526767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档