我有以下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列表为空。我没有收到任何错误,当我在代码中停止时,我看到原因集合中填充了表格中的项目。
答案 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中的一个方法,祝你好运!