При двусторонней привязке используется пользовательский элемент управления ... привязка к объекту, а не к элементу? - PullRequest
1 голос
/ 24 мая 2010

Я создал объект с простым свойством со значением по умолчанию. Затем я создал пользовательский элемент управления, в котором есть текстовое поле. Я установил datacontext пользовательского элемента управления для объекта.

В текстовом поле правильно отображается значение свойств по умолчанию, но я не могу обновить значение свойства, когда пользователь изменяет значение текстового поля. Я создал простой проект, чтобы проиллюстрировать мой код.

Спасибо за помощь !!

public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        private string _titleValue;

        public string TitleValue
        {
            get
            {
                return _titleValue;
            }
            set 
            {
                _titleValue = value;
                textBox1.Text = _titleValue;
            }
        }

        public static readonly DependencyProperty TitleValueProperty = DependencyProperty.Register(
           "TitleValue", typeof(string), typeof(UserControl1), new FrameworkPropertyMetadata(new PropertyChangedCallback(titleUpdated))
           );

//Don't think I should need to do this!!!
        private static void titleUpdated(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((UserControl1)d).TitleValue = (string)e.NewValue; 
        }
    }

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="94,97,0,0" Name="textBox1" VerticalAlignment="Top" Width="120"
                  Text="{Binding Path=TitleValue, Mode=TwoWay}"/>
    </Grid>
</UserControl>

    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();

                var dummy = new DummyObject("This is my title.");
                userControl11.DataContext = dummy;

            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("The value is: " + ((DummyObject)userControl11.DataContext).Title);
            }
        }

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1">
        <Grid>
            <my:UserControl1 HorizontalAlignment="Left" Margin="95,44,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="191" Width="293" 
                             TitleValue="{Binding Path=Title, Mode=TwoWay}"/>
            <Button Content="Check Value" Height="23" HorizontalAlignment="Left" Margin="20,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        </Grid>
    </Window>

1 Ответ

2 голосов
/ 24 мая 2010

DataContext в вашем пользовательском контроле не установлен.Укажите для него Name (я обычно называю это "ThisControl") и измените привязку TextBox к Text="{Binding ElementName=ThisControl, Path=TitleValue, Mode=TwoWay}".Вы также можете установить DataContext явно, но я считаю, что это предпочтительный способ.

Кажется, что DataContext по умолчанию должен быть "this", но по умолчанию это ничего.[править] Вы также можете добавить , UpdateSourceTrigger=PropertyChanged к вашей привязке, так как по умолчанию привязка текста TextBoxes обновляется только при потере фокуса.

...