XAML绑定用户控件TextBlock不会显示绑定数据

时间:2017-06-12 08:54:09

标签: c# xaml data-binding

我有一个列表视图控件,它使用DataTemplate来绑定数据。 在创建依赖项之后,绑定使用简单的字符串,但在绑定类属性时不起作用。如果我将数据绑定到textBlock它可以工作,但如果我将相同的东西绑定到我的用户控件它不起作用。

这是我的XAML:LISTVIEW

<ListView x:Name='lbUsers'
                 Height='370'
                 Canvas.Left='264'
                 Canvas.Top='183'
                 Width='1177'
                  Background='{x:Null}'>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <Views:UserSelectRibbon NameText ="{Binding Name}" />
                        <Image Width='10' />
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>

            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
                               ItemWidth="{Binding (ListView.View).ItemWidth, 
            RelativeSource={RelativeSource AncestorType=ListView}}"
                               MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}"
                               ItemHeight="{Binding (ListView.View).ItemHeight, 
            RelativeSource={RelativeSource AncestorType=ListView}}" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

        </ListView>

这是我的用户控制:

  public string NameText
        {
            get { return (string)GetValue(NameTextProperty); }
            set { SetValue(NameTextProperty, value); }
        }

        public static readonly DependencyProperty NameTextProperty =
            DependencyProperty.Register("NameText", typeof(string), typeof(UserSelectRibbon),null);

        public UserSelectRibbon()
        {
            InitializeComponent();
            DataContext = this;
        }

这是我的简单用户类:

public class User {
    public string Name { get; set; }
    public int Age { get; set; }
    public int Playlist { get; set; }
}

SO: 在XAML中如果我这样做:WORKS

  <Views:UserSelectRibbon NameText ="Some text here" /> 

这将起作用并将文本添加到用户控件

中的TextBlock

BUT: 在XAML中,如果我这样做:不要“工作

<Views:UserSelectRibbon NameText ="{Binding Name}" />

我想知道为什么没有绑定它可以工作,但它不适用于绑定

2 个答案:

答案 0 :(得分:4)

问题在于您的DataContext

public UserSelectRibbon()
{
    InitializeComponent();
    DataContext = this;
}

这对以下内容有影响:

<Views:UserSelectRibbon NameText ="{Binding Name}" />

在此处,DataContext已更改为Views:UserSelectRibbon,因此您无法再绑定到外部DataContext的任何内容。

解决方案:不要从内部将DataContext的{​​{1}}设置为自身。 <强>从不!

相反,请将其设置在usercontrols树中的元素上,或使用某些UserControlRelativeSource绑定。

内部DataContext的解决方案:

ElementName

<UserControl ...>
    <Grid x:Name="grid1">
        <TextBlock Text="{Binding NameText}"/>
    </Grid>
</UserControl>

使用RelativeSource的解决方案(您可以使用public UserSelectRibbon() { InitializeComponent(); grid1.DataContext = this; // set DataContext on inner control instead of the usercontrol itself } 基类型或您的特定用户控件内部类型):

UserControl

ElementName的解决方案:

<TextBlock Text="{Binding NameText,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>

答案 1 :(得分:-1)

我最近用itemsControl做了类似的事情。我可能会忘记一切。 无论如何,有一种更简单的方法,然后从项目本身直接绑定。相反,你从c#中调用该项目并在那里绑定。之后

Mainpage()
{
InitializeComponent();
}

仍然在括号中,您应该添加:

List<SampleItem> = new List<SampleItem>;
items.Add({NameText = Name});
lbusers.ItemsSource = items;

括号外:

public class SampleItem{
public string Name {get; set;}
}

您可以根据需要添加items.Add行,以及将显示的项目数。

相关问题