2010-10-23 13 views
5

Mam kontrolę z właściwością public MyClass MyProperty{...}, której wartość jest wyświetlana na ekranie jako wykres. Chcę tę nieruchomość być Bindable do innego MyClass w programie za pomocą klasy Binding (MyProperty byłby parametr w thisBinding konstruktora propertyName, a drugi MyClass byłby parametr dataMember).Oprawa OneWay na WinForms?

MyClass implementuje INotifyPropertyChanged, więc po tej stronie wszystko jest w porządku. Ale zdarza się, że jeśli nie zaimplementuję akcesora get w MyProperty i spróbuję powiązać z nim coś, otrzymam "Nie można powiązać z właściwością" MyProperty "na kontrolerze docelowej Nazwa parametru: PropertyName" błąd.

Czy to znaczy mam wdrożyć get akcesor nawet jeśli wiem, że nigdy nie będzie musiał odczytać jego wartość i chcę jednokierunkowy (od źródła do celu) wiążącej, a nawet jeśli po prostu wrócić null w get accessor?

Zgaduję, że klasa Binding wykorzystuje to do porównania nowej wartości ze starą lub do wykonania innych wewnętrznych rzeczy. Nie jestem więc pewien, czy dobrze jest po prostu zwrócić null, czy lepiej byłoby zawsze zachować kopię dowolnego obiektu, który został przypisany z akcesorium set i zwrócić go w accessorze get. Może naprawdę nie muszę nawet pisać akcesorium get i robię coś innego nie tak. Zdarza się, że błąd pojawia się tylko wtedy, gdy skomentuję akcesor get i przestaję go odzyskiwać, gdy go odłożę.

Edit: W przypadku jakichkolwiek niejasności: Kiedy mówię MyProperty „s wartość jest wyświetlana na ekranie w postaci wykresu nie mam na myśli to ma wartość, że jakiś inny kod odczytuje i pokazać na ekranie. Nikt nie czyta żadnej wartości z MyProperty. MyProperty 's access to ten, który rysuje rzeczy na ekranie i to koniec cyklu.

+1

Proszę sformatować, aby użyć paragrafów. –

+0

Istnieje również powiązanie OneWayToSource. Trudno powiedzieć, czy to rozwiąże twój problem, bo nie mogę przeczytać całej rzeczy :) Podaj kilka krótkich klipów przykładowego kodu. –

+0

Właściwie myślałem o akapitach, ale nie byłem pewien, gdzie je umieścić. Po prostu je gdzieś położę :). – Juan

Odpowiedz

6

nie jestem 100% pewien, rozumiem co masz na myśli, ale myślę, że wyjątek jesteś napotykają wynika z CheckBinding funkcji klasy za Binding (reflectored):

if (descriptor.IsReadOnly && (this.controlUpdateMode != ControlUpdateMode.Never)) 
{ 
    throw new ArgumentException(SR.GetString("ListBindingBindPropertyReadOnly", new object[] { this.propertyName }), "PropertyName"); 
} 

Dlatego zmiana Oprawa na ControlUpdateMode do ControlUpdateMode.Never może być tym, czego szukasz

+0

Och ... to ma sens. – Juan