Windows Phone CustomControl数据绑定

时间:2015-02-23 23:17:41

标签: c# xaml data-binding windows-phone

是Windows Phone 8.1(运行时)

我有一些将自定义用户控件与数据列表绑定的问题。我会尽可能简单。

我的问题是,如果我在自定义控件中使用DataBind {Binding Something},它将无法工作。

我需要将绑定数据(字符串)传输到自定义控件。

奇怪的是,如果我不使用DataBind,它将正常工作。例如MyCustomControllParameter =“some string”(在我的例子中是'BindingTextValue'属性)

有没有人知道如何使用DataTemplate将自定义用户控件与ListView内部绑定。

假设:

XAML测试主页

<Grid  Background="Black">
    <ListView x:Name="TestList" Background="#FFEAEAEA">

        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Background="#FF727272">
                    <local:TextBoxS BindingTextValue="{Binding Tag, FallbackValue='aSource'}" local:TextBoxS>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>



    </ListView>

</Grid>

XAML测试主页c#

public sealed partial class MainPage : Page
{
    List<TTag> tags = new List<TTag>();

    public MainPage()
    {
        this.InitializeComponent();

        this.NavigationCacheMode = NavigationCacheMode.Required;
    }


    public class TTag
    {
        public string Tag { get; set; }
    }

    private void InitializeAppData()
    {
        TTag tag = new TTag() { Tag = "hello world" };
        tags.Add(tag);
        tags.Add(tag);
        tags.Add(tag);
        TestList.ItemsSource = tags;
    }

         protected override void OnNavigatedTo(NavigationEventArgs e)
    {

        InitializeAppData();
    }


}

用户控制XAML:

<UserControl
x:Class="CustomControllTest.TextBoxS"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CustomControllTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="#FF4F4F4F"   >
    <RichTextBlock x:Name="MyTestBlock">
    </RichTextBlock>
</Grid>

用户控制c#.cs

    public TextBoxS()
    {
        this.InitializeComponent();
        LayoutRoot.DataContext = this;

    }


    public static readonly DependencyProperty BindingTextValueProperty = DependencyProperty.Register(
                                     "BindingTextValue",
                                     typeof(string),
                                     typeof(TextBoxS),
                                     new PropertyMetadata(default(string)));

    public string BindingTextValue
    {
        get
        {
            return GetValue(BindingTextValueProperty) as string;
        }
        set
        {
            SetValue(BindingTextValueProperty, value);
            //This method adds some custom logic into RichTextBlock, pointed correctly
            SetupSpotterBox(value);
        }
    }

感谢您的帮助;)

2 个答案:

答案 0 :(得分:2)

你需要设置MainPage的DataContext,因为它没有设置在任何地方

public MainPage()
{
    this.InitializeComponent();

    this.NavigationCacheMode = NavigationCacheMode.Required;
    this.DataContext = this;
}

下一步从UserControl中删除以下行

this.DataContext = this;

这是为了让您的用户控件能够选择正确的DataContext,例如MainPages

最后对UserControl xaml进行一些更改

<UserControl
x:Class="App21.TextBoxS"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App21"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400" x:Name="root">

<Grid x:Name="LayoutRoot">
    <TextBlock x:Name="MyTestBlock" FontSize="22" 
               Text="{Binding ElementName=root, Path=BindingTextValue}" Foreground="Red">
    </TextBlock>                    
</Grid>

注意控件本身的x:Name =“root”,我使用了一个TextBlock,这样我就可以使用ElementName和Dependency Property BondingTextValue显示Binding to Text属性。

答案 1 :(得分:0)

您不必在属性Setter中更新您的控件。试试这段代码:

public static readonly DependencyProperty BindingTextValueProperty = DependencyProperty.Register(
                                 "BindingTextValue",
                                 typeof(string),
                                 typeof(TextBoxS),
                                 new PropertyMetadata(default(string), PropertyChangedCallback));


private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) {

    //This method adds some custom logic into RichTextBlock, pointed correctly
    var textBoxS = dependencyObject as TextBoxS;

    textBoxS.SetupSpotterBox((string) args.NewValue);
}


public string BindingTextValue
{
    get { return GetValue(BindingTextValueProperty) as string; }
    set { SetValue(BindingTextValueProperty, value); }
}