是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);
}
}
感谢您的帮助;)
答案 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); }
}