【问题标题】:WPF binding to label doesn't working?WPF 绑定到标签不起作用?
【发布时间】:2011-03-23 08:04:53
【问题描述】:

有一个网格视图列出了类属性中的某些内容。类有四个属性,其中三个我绑定到 3 列网格视图,最后一个属性我绑定到另一个标签。

网格视图正在工作并绑定值,但 Lable 不是...原因是什么?

public class ProjectData
{
     public string ProjectName {get;set;}
        public string MachineName {get;set;}
        public string MachineNumber {get;set;}
        public string StatusDetail {get;set;}
}

这里是 xaml:

 <ListView 
            Grid.Row="1" 
            Grid.ColumnSpan="2" 
            Name="PrjtListView" 
            HorizontalContentAlignment="Stretch" 
            FontSize="15" Background="#FFF2F2B7" 
            BorderThickness="1"
            ItemsSource="{Binding ProjectData}">
            <ListView.View>
                <GridView AllowsColumnReorder="True" 
                      ColumnHeaderToolTip="appconfig servers"
                      ScrollViewer.CanContentScroll="True">
                     <GridViewColumn Header="Project Name" Width="400"
                                    DisplayMemberBinding="{Binding ProjectName}" />
                    <GridViewColumn Header="Build Machine" Width="150"
                                    DisplayMemberBinding="{Binding MachineName}"/>
                    <GridViewColumn Header="Port number" Width="120" 
                                DisplayMemberBinding="{Binding MachineNumber}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <UniformGrid Grid.Row="2" Grid.Column="1" VerticalAlignment="Center">
            <Button Content="add to cctray" Margin="0,0,5,0" 
                    Command="{Binding AddToCCTray}"/>
        </UniformGrid>
        **<Label Grid.Row="2" Grid.Column="0" Name="lblTotalProjects" FontSize="12" FontStyle="Italic"
Content="{Binding StatusDetail}"></Label>**  
                 -->> This is not working

这只是代码sn-p,如果需要我会提供其他细节。

编辑:我们可以在同一个 xaml 文件中绑定相同的数据上下文两次吗?一个用于其他控件,一个用于其他控件

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    我怀疑您在创建控件之前设置了 StatusDetail-property 的值。
    因为auto-properties不支持任何更改通知,标签不会知道有一些数据,因此不会显示任何内容。
    尝试为您的属性实现INotifyPropertyChanged。这可能会解决您的问题。

    【讨论】:

    • 我实现的一切......其他三个属性很有效,但最后一个属性没有绑定。我实现了 OnPropertyChanged
    • @GAPS:检查visual studio的输出窗口。如果存在绑定错误,您将在此窗口中看到。我看到你给标签起了名字。检查您是否没有从后面的代码中为 Content 属性设置值。这将删除绑定。
    • @GAPS:看看 Jens (+1) 的解决方案,大概就是这样,我忽略了其他属性用于构建项目的事实。
    【解决方案2】:

    这可能是您在 ListView 范围内定义 ItemsSource="{Binding ProjectData}" 并且您的 Label 不知道其绑定源的原因。将视图的“DataContext”设置为“ProjectData”实例,这可能会有所帮助。

    【讨论】:

    • 否... ListView 的 DataContext 不起作用。即使这样也不会填充gridview。
    • @GAPS 您可以从 ListView 中保留 ItemsSource="{Binding ProjectData}" 并将 View 的 DataContext 添加到 ProjectData 以便使标签绑定工作。
    【解决方案3】:

    标签位于 ListView 之外,因此具有与网格行不同的 DataContext。

    我猜你当前的 DataContext 有一个名为 ProjectData 的IList&lt;ProjectData&gt;,否则 ItemsSource 绑定会失败。如果是这样,应该为哪个项目显示 StatusDetail?如果此标签应出现在每个网格行中,每个项目一次,您需要为此创建一个新列。

    另外,看看你的输出窗口。绑定错误会在那里提供很好的错误消息。

    【讨论】:

    • 你是对的。如果我在 ListView 中添加 StatusDetail,它的工作原理。因此,再次将 DataContext 作为 ProjectData 分配给标签应该可以工作。但&lt;Label Grid.Row="2" Grid.Column="0" Name="lblTotalProjects" DataContext="{Binding ProjectData}" Content="{Binding StatusDetail}"&gt;&lt;/Label&gt; 也不起作用。
    • @GAPS:不,它不应该工作。 ListView 采用 IList(或 IEnumerable?)的 Items,为每个项目生成一行,并将该行的 DataContext 设置为 Item。所以将Label的DataContext设置为ListView的ItemsSource应该永远不会有想要的效果。
    • 那怎么办...同一个xaml文件可以有两个或两个以上的数据上下文?
    • @GAPS:将标签的内容绑定到{Binding SelectedItem.StatusDetail, ElementName=PrjtListView} 是否适合您的情况?
    • @Jens 这有效,但仅当我单击或选择gridview 中的项目时。我希望在网格视图上发生任何更新时,即使在绑定的情况下,标签也应该更改
    【解决方案4】:

    我总是将绑定设置为{Binding Path="StatusDetail"}

    希望对你有所帮助。

    【讨论】:

    • {Binding Path="StatusDetail"} {Binding StatusDetail} 两者都一样
    猜你喜欢
    • 2018-02-04
    • 2018-04-07
    • 2016-06-22
    • 2018-02-20
    • 2022-01-11
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多