Простое связывание данных в Windows Phone User Control не работает - PullRequest
1 голос
/ 17 марта 2012

У меня проблема с чем-то, что должно быть очень простым сценарием привязки данных. Я хочу связать список предметов. Я хочу создать пользовательский элемент управления, поместить его в шаблон ItemsControl и связать ItemsControl с некоторыми данными. Я совершенно доволен одноразовым связыванием данных, поэтому я надеялся избежать изучения свойств зависимостей и всего связующего с данными для этого простого сценария.

Вот XAML для пользовательского элемента управления:

<TextBlock>Just Something</TextBlock>

И код позади:

namespace TestWindowsPhoneApplication
{
    public partial class TestControl : UserControl
    {
        public TestData SomeProperty { get; set; }
        public String SomeStringProperty { get; set; }

        public TestControl()
        {
            InitializeComponent();
        }
    }
}

MainPage.xaml:

<ItemsControl Name="itemsList" ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <t:TestControl SomeStringProperty="{Binding Path=SomeString}"></t:TestControl>
            <!--<TextBlock Text="{Binding Path=SomeString}"></TextBlock>-->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Вот MainPage.xaml.cs:

namespace TestWindowsPhoneApplication
{
    public class TestData
    {
        public string SomeString { get; set; }
    }

    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            itemsList.DataContext = new TestData[] { new TestData { SomeString = "Test1" }, new TestData { SomeString = "Test2" } };
        }
    }
}

Когда я запускаю проект, я получаю сообщение об ошибке "параметр неверен". Я также попытался связать напрямую с элементом SomeProperty = {Binding}, так как это то, что я действительно хочу сделать, но это вызывает ту же ошибку. Если я попытаюсь сделать то же самое с элементом управления TextBlock (закомментированная строка), все будет нормально.

Как я могу реализовать этот простой сценарий?

1 Ответ

3 голосов
/ 17 марта 2012

Чтобы сделать свойство в вашем пользовательском элементе управления «связываемым», вы должны сделать его свойством зависимости. Посмотрите мой ответ здесь для хорошего простого примера того, как сделать это на пользовательском элементе управления: передача значения выбранного элемента gridview в другую ViewModel другого Usercontrol

public string SomeString
{
    get { return (string)GetValue(SomeStringProperty); }
    set { SetValue(SomeStringProperty, value); }
}
public static readonly DependencyProperty SomeStringProperty =
    DependencyProperty.Register("SomeString", typeof(string), typeof(TestControl),
    new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnSomeStringChanged)));

private static void OnSomeStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((TestControl)d).OnSomeStringChanged(e);
}

protected virtual void OnSomeStringChanged(DependencyPropertyChangedEventArgs e)
{
    //here you can do whatever you'd like with the updated value of SomeString
    string updatedSomeStringValue = e.NewValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...