簡體   English   中英

我無法使用INotifyPropertyChanged更新我的值

[英]I can't get my value to update using INotifyPropertyChanged

因此,我正在通過編寫Yatzee游戲來學習WPF,而且我正在走向某個地方。 但是現在我不明白為什么我的“當前滾動”計數器不會在視圖中更新。 我完成了骰子的工作,擲骰子按鈕為我的骰子提供了新值-並在視圖中對其進行了更新。 但是我的“當前滾動”變量不會。 到目前為止,這是我所做的。

// CurrentRoll.cs
    public class CurrentRoll : INotifyPropertyChanged
{
    public int _roll;

    public int Roll
    {
        get { return _roll; }
        set
        {
            if (value != _roll)
            { 
            _roll = value;
            OnPropertyChanged("Roll");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

這就是我的DiceModelView。 當我點擊“滾動骰子”按鈕時,只要不選中它們,我就會在所有骰子上獲得新值。 我還增加了_currentRoll變量,並且只允許新的滾動,只要_currentRoll仍小於3。此邏輯有效,該變量有效,但它在View中的表示無效。 我也將其初始值更改為其他值,只是為了查看綁定是否有效。

public class DiceModelView : INotifyPropertyChanged
{
    Die _die;
    public CurrentRoll _currentRoll;

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Die> myDices { get; set; }
    public ICommand RollCommand { get; set; }

    public DiceModelView()
    {
        myDices = new ObservableCollection<Die>()
        {
            new Die { Id = 0, Roll = 0, Checked = false },
            new Die { Id = 1, Roll = 0, Checked = false },
            new Die { Id = 2, Roll = 0, Checked = false },
            new Die { Id = 3, Roll = 0, Checked = false },
            new Die { Id = 4, Roll = 0, Checked = false }
        };
        _currentRoll = new CurrentRoll();
        _currentRoll._roll = 0;
        RollCommand = new Command (executeMethod, canexecuteMethod);
    }

    public bool canexecuteMethod(object parameter)
    {
        return true;
    }

    private void executeMethod(object parameter)
    {
        var r = new Random();
        if (_currentRoll._roll < 3)
        {
            foreach (Die d in myDices)
            {
                if (d.Checked == false)
                {
                    d.Roll = r.Next(1, 7);
                }
            }
        }
        _currentRoll._roll++;
    }

    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public Die die
    {
        get { return _die; }
        set { _die = value; }
    }

    public CurrentRoll currentRoll
    {
        get { return _currentRoll; }
        set { _currentRoll = value;
            NotifyPropertyChanged("currentRoll");
        }
    }

現在,我的應用程序如何運行,在此示例中,我將_currentRoll._roll設置為111只是為了確保它能正常工作。我沒有擲骰子,因為上述值大於3。

最后,這是我使用的XAML代碼:

<Window.DataContext>
    <local:DiceModelView/>
</Window.DataContext>
<StackPanel>
    <TextBlock Text="{Binding currentRoll.Roll, UpdateSourceTrigger=PropertyChanged}"/>
    <ListView x:Name="DiceView" ItemsSource="{Binding myDices}" Width="500" HorizontalContentAlignment="Center" >
        <ListView.ItemTemplate>
            <DataTemplate >
                <CheckBox Content="{Binding Roll}" IsChecked="{Binding Checked}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="Roll the dices!" Command="{Binding RollCommand}"/>
</StackPanel>
</Window>

您需要更新Roll屬性,而不是_role字段。

_roll無論如何_roll應該是私有的。

試想一下:您正在屬性設置器中引發屬性更改事件,因此只有在設置屬性值時才會執行此操作。

暫無
暫無

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

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