If you have control over the code that declares the property, then certainly you can put a breakpoint inside the setter. Even if it is currently an auto-implemented property, e.g.:
public string SomeProperty { get; set; }
you can easily change it like this:
private string _someProperty;
public string SomeProperty {
get { return _someProperty; }
set {
// Set breakpoint here, or type Debugger.Break();
_someProperty = value;
}
}
If the value is actually a field instead of a property, you can still change it into a property to achieve the same thing.
If you don’t have access to the code that declares the property, then it’s quite a bit harder. Personally what I do is this, but it’s a bit laborious:
Declare a public static field in your Program
class of the type that declares the property.
Early in the program, find a reference to the object whose property value changes and put that reference in this static field. If necessary, use Reflection to retrieve private fields.
Add global::MyNamespace.Program.MyField.ImportantProperty
to the Watch window while debugging.
Step through the code until the value in the watch window changes.