绑定到ObservableCollection的Listbox为空

时间:2012-08-03 16:11:27

标签: c# .net wpf data-binding binding

我有以下xaml:

<Window x:Class="Retail_Utilities.Dialogs.AdjustPriceDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ShowInTaskbar="False"
    WindowStartupLocation="CenterOwner" Name="Adjust_Price"
    Title="Adjust Price" Background="#ee0e1c64" AllowsTransparency="True" WindowStyle="None" Height="330" Width="570" KeyDown="Window_KeyDown" Loaded="Window_Loaded">

<Grid Height="300" Width="550">
<ListBox HorizontalAlignment="Right" Margin="0,110,35,60" Name="lstReasons" Width="120" VerticalAlignment="Stretch"
             ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=reasons}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=POS_Price_Change_Reason}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
</Window>

以下是相关的c#:

namespace Retail_Utilities.Dialogs
{
public partial class AdjustPriceDialog : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Twr_POS_Price_Change_Reason> reasons; ...

最后,这是打开此窗口的另一个页面的代码:

AdjustPriceDialog apd = new AdjustPriceDialog();
apd.Owner = (Window)this.Parent;
apd.reasons = new ObservableCollection<Twr_POS_Price_Change_Reason>();
var pcr = from pc in ctx.Twr_POS_Price_Change_Reasons where pc.Deactivated_On == null select pc;
foreach (Twr_POS_Price_Change_Reason pc in pcr)
{
    apd.reasons.Add(pc);
}
apd.AdjustingDetail = (Twr_POS_Invoice_Detail)lstDetails.SelectedItem;
if (apd.ShowDialog() == true)
{

}

当对话框打开时,我的lstReasons列表为空。我没有收到任何错误,当我在代码中停止时,我看到原因集合中填充了表格中的项目。

3 个答案:

答案 0 :(得分:0)

原因需要是一个属性(添加{ get; set;})。另外,看看Visual Studio输出 - 它显示了绑定错误,应该有一些关于绑定失败的信息。

答案 1 :(得分:0)

您的绑定路径似乎设置为POS_Price_Change_Reason,而您的属性名称为reasons。除非您在示例代码中未包含POS_Price_Change_Reason,并且reasons是此属性的支持字段。

另外,请注意,您仅能绑定到公共属性,而不是字段。此外,如果更改属性的值,则需要通过为该属性调用PropertyChangedEventHandler事件来通知视图此更改:

PropertyChanged(new PropertyChangedEventArgs("YourPropertyName"));

答案 2 :(得分:0)

问题似乎是如何创建属性。 我知道你把你​​的物品作为一个可观察的收藏品,但这并不意味着它是自我观察的! 因此,您需要通过在setter中执行以下操作来更改此属性时通知UI:

public ObservableCollection<Twr_POS_Price_Change_Reason> reasons
{
get{....}
set
{
Notify('reasons')
}
}

我不记得确切的代码,因为我暂时没有使用WPF,但它是INotifyPropertyChanged中的一个方法,祝你好运!