2015-02-23 106 views
0

这是Windows Phone 8.1(运行时)Windows Phone CustomControl数据绑定

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

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

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

奇怪的是,如果我不使用DataBind,它将正常工作。例如MyCustomControllParameter =“一些字符串”(在我的示例'BindingTextValue'属性中)

有谁知道如何将自定义用户controll与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

你需要设置的的MainPage的DataContext因为它不是某个位置设置过

public MainPage() 
{ 
    this.InitializeComponent(); 

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

Next 从用户控件删除以下行

this.DataContext = this; 

这是为了让你的用户控件拿起正确的DataContext例如MainPages

最后一些更改用户控件的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绑定到文本属性。

+0

没有probs不会忘记标记为答案,如果它解决了问题或没有,如果它没有;) – SWilko 2015-02-24 13:40:26

0

您不必在属性设置器中更新您的控件。试试这个代码:

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); } 
} 
相关问题