Как заставить источник данных обновляться из TemplateControl - PullRequest
0 голосов
/ 24 декабря 2011

Я сломал голову, решив простую задачу. У меня есть пользовательский элемент управления с заполненным свойством Template. Шаблон представляет собой простую сетку с TextBox внутри. Это текстовое поле привязано к свойству синглтона с сеттером и геттером. Как я могу программно заставить TextBox прочитать значение из синглтона и вернуть его обратно?

<Window x:Class="Spike.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="305" Width="521" xmlns:my="clr-namespace:Spike" xmlns:Data="clr-namespace:Spike.Data">
    <Grid>
        <Grid.Resources>
            <ControlTemplate x:Key="editingTemplate">
                <Grid>
                    <TextBox Text="{Binding Source={x:Static Data:MyClass.Instance}, Path=Value2}"/>
                </Grid>
            </ControlTemplate>
        </Grid.Resources>

        <UserControl Template="{StaticResource editingTemplate}" HorizontalAlignment="Left" Margin="58,60,0,0" x:Name="myUserControl1" VerticalAlignment="Top" Height="75" Width="284" />
        <Button Content="Update source" Height="23" HorizontalAlignment="Left" Margin="184,23,0,0" Name="button1" VerticalAlignment="Top" Width="111" Click="button1_UpdateSource" Focusable="False" />
        <Button Content="Update control" Focusable="False" Height="23" HorizontalAlignment="Left" Margin="58,23,0,0" Name="button2" VerticalAlignment="Top" Width="111" Click="button2_UpdateControl" />
    </Grid>
</Window>
namespace Spike.Data
{
    public class MyClass
    {
        private static readonly MyClass MyClassInstance = new MyClass();

        public MyClass()
        {
            Value1 = "value1";
            Value2 = "value2";
        }

        public static MyClass Instance
        {
            get { return MyClassInstance; }
        }

        public string Value1 { get; set; }

        public string Value2 { get; set; }
    }
}

Другими словами, что должно быть реализовано в button2_UpdateControl и button1_UpdateSource методах?

Заранее благодарю за любую помощь

1 Ответ

0 голосов
/ 24 декабря 2011

Привязка не должна вызываться повторно вручную. Вместо этого вы должны попытаться заставить ваш текущий механизм связывания работать должным образом. Ваш TextBox должен быть привязан к DependancyProperty или DataContext из TextBox должен реализовывать INotifyPropertyChanged . Определите вашу Value2 собственность следующим образом:

public static readonly DependencyProperty Value2Property = 
    DependencyProperty.Register("Value2", typeof(string), typeof(MyClass), new PropertyMetadata(string.Empty));

public string Value2
{
    get { return (string)GetValue(Value2Property); }
    set { SetValue(Value2Property, value); }
}

Кроме того, MyClass должен реализовывать UIElement.

...