在通知属性更改而不将新实例分配给属性时,Wpf 绑定不起作用

问题描述 投票:0回答:1

所以,我有这个非常简单的代码,当我在使用注释的代码行时单击按钮时,GUI 中的值通过绑定更新,一切正常。如果我使用其他两行(未注释),即使我通知更改,也不会发生任何情况。

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private Spot _position = new Spot(0, 0);
    public Spot Position
    {
        get { return _position; }
        set { _position = value; OnPropertyChanged("Position"); }
    }

    public MainWindow()
    {
        InitializeComponent();
        win.DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //Position = new Spot(5,5);
        Position.UpdateX(5);
        OnPropertyChanged("Position");
    }
}

public class Spot
{
    public Spot(int x, int y)
    {
        X = x;
        Y = y;
    }

    public void UpdateX(int x)
    {
        X += x;
    }
    public void UpdateY(int y)
    {
        Y += y;
    }

    public override string ToString()
    {
        return string.Format("{0}; {1}", X, Y);
    }

    public int X { get; set; } = 0;
    public int Y { get; set; } = 0;
}

XAML

<StackPanel x:Name="win" Orientation="Vertical" Margin="100">
    <Label Content="{Binding Position, UpdateSourceTrigger=PropertyChanged}" Width="100" Height="25"></Label>
    <Button Width="100" Height="25" Click="Button_Click">Click</Button>
</StackPanel>

预先感谢您的任何建议。

c# wpf binding
1个回答
1
投票
<Label Content="{Binding Position}" ... />

这将在每次视图模型引发

ToString()
事件时在
Position
上调用
PropertyChanged
来报告
Position
的值已更改。也就是说,如果一个 new 对象实例已被分配给
Position
属性
。您可以整天坐在那里为旧实例的属性分配新值,而视图模型不知道正在发生这种情况,因此不会引发任何事件。

这会起作用:

<Label>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="{}{0}: {1}">
                <Binding Path="Position.X" />
                <Binding Path="Position.Y" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Label>

这也行:

<Label>
    <TextBlock>
        <TextBlock Text="{Binding Position.X, StringFormat='{}{0}: '}" />
        <TextBlock Text="{Binding Position.Y}" />
    </TextBlock>
</Label>
© www.soinside.com 2019 - 2024. All rights reserved.