簡體   English   中英

INotifyPropertyChanged,事件始終為null

[英]INotifyPropertyChanged, event always null

嗨:)我正在嘗試弄清楚INotifyPropertyChanged如何與一個非常基本的應用程序一起工作。 我只是在mainWindow中有一個按鈕,當您按下它時,它應該觸發一個事件來更新已綁定到特定屬性的textBox。 但是,即使觸發了事件,事件也始終為null,因此不會更新textBox。

<Window x:Class="StockViewer.MainWindow"
    <!--Just erased some basic xaml here-->
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <local:RandomGen/>
</Window.DataContext>

<Grid>
    <Button Click="incr" Height="30" VerticalAlignment="Top" Background="DarkGoldenrod"></Button>
    <TextBlock VerticalAlignment="Top" Margin="40" Text="{Binding price, UpdateSourceTrigger=PropertyChanged}" Background="Aqua"></TextBlock>
</Grid>

按下按鈕后,價格應會發生變化:

public partial class MainWindow : Window
{
    private RandomGen gen;
    public MainWindow()
    {
        gen = new RandomGen();          
        InitializeComponent();
    }
    private void incr(object sender, RoutedEventArgs e)
    {
        gen.price = 7;
    }
}

class RandomGen : NotifiedImp
    {
     public RandomGen()
        {
            _i = 3;
        }
        private int _i;

        public int price
        {
            get { return _i; }
            set
            {
                _i = value;
                OnPropertyChanged("price");
            }
        }
    }

class NotifiedImp: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;        
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this,new PropertyChangedEventArgs(propertyName));
            }   
        }
    }

真的很奇怪,處理程序始終為null。 謝謝 :)

您有兩個RandomGen實例,其中一個在您的XAML中初始化:

<Window.DataContext>
     <local:RandomGen/>
</Window.DataContext>

另一個在您的MainWindow構造函數中初始化:

gen = new RandomGen();

這意味着當您更新gen.price = 7; 您沒有更新DataContext實例。

一種解決方案是刪除XAML中的<Window.DataContext>設置,並在MainWindow構造函數中設置DataContext ,如下所示:

public MainWindow()
{
    gen = new RandomGen();          
    InitializeComponent();
    DataContext = gen;
}

最類似於MVVM的解決方案是在RandomGen對象上使用ICommand更新price而不是使用事件處理程序,然后在XAML中使用此命令,例如:

<Button Command="{Binding IncrementPriceCommand}"></Button>

然后由您決定如何初始化DataContext ,而無需以任何方式保留RandomGen支持字段。

暫無
暫無

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

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