1

我有以下 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 列表是空的。我没有收到任何错误,当我在代码中停止时,我看到原因集合被表中的项目填充。

4

3 回答 3

0

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

于 2012-08-03T16:17:43.917 回答
0

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

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

PropertyChanged(new PropertyChangedEventArgs("YourPropertyName"));
于 2012-08-03T16:21:11.723 回答
0

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

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

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

于 2012-08-03T16:22:05.463 回答