簡體   English   中英

使用INotifyPropertyChanged的WPF綁定不會更新

[英]WPF Binding with INotifyPropertyChanged does not update

當我更新它所綁定的屬性時,我在更新時似乎遇到嚴重問題讓我的WPF UI更新。 這是我的視圖模型類定義:

namespace WpfModel
    {
        class AppModel : INotifyPropertyChanged
        {
            private int _count = 7;

        public int Count { get { return _count; } 
        set { _count = value;     OnPropertyChanged("Count"); } }

        public void Increment()
        {
            Count++;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string prop)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;

            if (handler != null)
            {
                var e = new PropertyChangedEventArgs("prop");
                handler(this, e);
            }
        }
    };
}

這與我在以下XAML中的簡單UI綁定:

<Window x:Class="WpfModel.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:WpfModel"
        Title="WPF Data Model Demo" Height="128" Width="284" >

    <Window.DataContext>
        <vm:AppModel />
    </Window.DataContext>

    <Grid Height="Auto" Width="Auto">
        <Button Margin="0,0,12,12" Name="IncButton" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="IncButton_Click" Content="Increment" />
        <Label Content="Count Variable:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" />
        <Label Height="28" Margin="116,12,0,0" Name="CountLabel" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Content="{Binding Path=Count}" />
    </Grid>
</Window>

該應用程序定義如下:

namespace WpfModel
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private AppModel _model = new AppModel();

        public MainWindow()
        {
            InitializeComponent();

            //_model = new AppModel();
        }

        private void IncButton_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

當應用程序啟動時,一切都很好,標簽甚至最初顯示模型的Count屬性中的任何值。 調用增量正確更新模型,並直接遞增Count屬性,如代碼中所示也可以正常工作。

這里的問題是,PropertyChanged事件處理程序似乎永遠不會被添加到。 我可以單步執行調試器中的代碼並查看屬性更新中的值,我甚至可以看到對OnPropertyChanged的調用,但PropertyChanged處理程序本身始終為null。

我的綁定可能有問題嗎?

我正在使用MSVC 2010 Express。

問題是,你必須為一個實例變量,_model的WpfModel, 不是唯一的被用作窗口的DataContext的相同的實例。 因此,它不受任何約束,它的PropertyChanged將始終為null。

更改您的XAML以將datacontext設置為:

<Window.DataContext>
            <vm:AppModel x:Name="_model" />
</Window.DataContext>

擺脫后面代碼中聲明的實例變量,並修復OnPropertyChanged實現(使用參數而不是文字字符串“prop”),它可以工作。

這一行:

var e = new PropertyChangedEventArgs("prop");

應該:

var e = new PropertyChangedEventArgs(prop);

您正在傳遞字符串“prop”,因此不會觸發偵聽“Count”的綁定值。

**編輯**基於你的其他評論(答案?)我認為我最好用修復更新這個 - 你可以使用已經給出的答案當然但我不想復制別人:)。

將其添加到您的點擊處理程序:

((AppModel)this.DataContext).Count += 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM