所以,我有这个非常简单的代码,当我在使用注释的代码行时单击按钮时,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>
预先感谢您的任何建议。
<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>