Привязка свойства элемента управления в пользовательском элементе управления - PullRequest
2 голосов
/ 06 марта 2011

Для целей этого вопроса я определил очень простой пользовательский элемент управления:

<UserControl x:Class="simpleUserControl.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Height="300" 
             Width="300">
     <Grid>
         <TextBox Name="TextBox1"/>
     </Grid>
 </UserControl>

Я хочу, чтобы пользователь (пользовательского элемента управления) мог установить свойство 'Text' для TextBox1 ', поэтому я определил свойство (названное' text '), которое получает и устанавливает TextBox1.Text:

namespace simpleUserControl
{
    public partial class UserControl1 : UserControl
    {
        public string text
        {
            get { return TextBox1.Text; }
            set { TextBox1.Text = value; }
        }

        public static readonly DependencyProperty textProperty = DependencyProperty.Register("text", typeof(string), typeof(UserControl1));

        public UserControl1()
        {                       
            InitializeComponent();
        }
    }
}

Теперь при использовании пользовательского элемента управления я хочу привязать это свойство 'text' к какому-либо строковому объекту:

 <Window x:Class="WpfApplication33.Window1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:simple_user_control="clr-namespace:simpleUserControl;assembly=simpleUserControl"
         Title="Window1" 
         Height="300" 
         Width="300" 
         Loaded="Window_Loaded">
    <Grid Name="MainGrid">
        <simple_user_control:UserControl1 Name="MyUserControl">
            <simple_user_control:UserControl1.text>
                <Binding Path="my_text"/>
            </simple_user_control:UserControl1.text>
        </simple_user_control:UserControl1>
    </Grid>
</Window>

и код:

namespace WpfApplication33
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        string my_text = "this is a text";
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            MainGrid.DataContext = this;
        }
    }
}

Но по какой-то причине это не работает ... Я не понимаю почему, потому что я установил DataContext и поместил ссылку на пользовательский элемент управления ... Что я делаю неправильно? (Стоит отметить, что при установке свойства text прямо так:

MyUserControl.text = "Another text";

все работает нормально, и поэтому я думаю, что эта проблема как-то связана с привязкой).

Ответы [ 3 ]

0 голосов
/ 06 марта 2011

Вы были правы относительно реализации INotifyPropertyChanged, но все еще чего-то не хватает.

Код главного окна теперь выглядит следующим образом:

  public partial class MainWindow : Window, INotifyPropertyChanged
{
 public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private string _my_text;
    string my_text
    {
        get { return _my_text; }
        set 
        { 
            _my_text = value;
            OnPropertyChanged("my_text");
        }
    }

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        MainGrid.DataContext = this;
        MyUserControl.text = "This is a text";
        my_text = "Another text";  
    }
 }

И все же, единственный текст, который появляется, это «Это текст», а не «Другой текст».

Что сейчас не так?

0 голосов
/ 18 марта 2011

Вы не подключили свойство TextBox.Text к свойству зависимости в пользовательском элементе управления.Изменения в тексте DependencyProperty будут обрабатываться WPF и фактически не будут проходить через свойство text вашего элемента управления.Вы должны определить свой элемент управления следующим образом, чтобы привязать свойство TextBox.Text к свойству зависимости:

<UserControl x:Class="simpleUserControl.UserControl1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Height="300" Width="300" x:Name="control">
 <Grid>
     <TextBox Name="TextBox1" Text="{Binding text, ElementName=control}"/>
 </Grid>
 </UserControl>

В коде позади:

namespace simpleUserControl
{
public partial class UserControl1 : UserControl
{
    public string text
    {
        get { return (string)GetValue(textProperty); }
        set { SetValue(textProperty, value); }
    }

    public static readonly DependencyProperty textProperty = DependencyProperty.Register("text", typeof(string), typeof(UserControl1));

    public UserControl1()
    {                       
        InitializeComponent();
    }
}
}

Тогда в вашем MainWindow вы должны бытьв состоянии сделать это, и это должно работать:

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
    MainGrid.DataContext = this;
    my_text = "This is a text";
    my_text = "Another text";  
}
0 голосов
/ 06 марта 2011

У вас нет свойства, у вас есть личный член для my_text, и WPF не будет связываться с ним.

Попробуйте:

private string myText = "this is a text";
public string MyText
{
    get
    {
        return myText;
    }

    set
    {
        myText = value;
    }
}

возможно, используйте INotifyPropertyChanged в установщике, если вы хотите изменить текст и отобразить изменения автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...