색상이있는 ComboBox와 색상이있는 사각형을 그리는 사용자 정의 Canvas가 포함 된 TabItem이있는 간단한 WPF 창이 있습니다. 내 PaintCanvas에서 나는 이런 DependencyProperty에 있습니다DependencyProperty가 업데이트되지 않았습니다.
PaintObject 종속성 속성은 PaintViewModel에 해당 속성에 XAML에서 바인딩class PaintCanvas : System.Windows.Controls.Canvas
{
public static readonly DependencyProperty PaintObjectProperty = DependencyProperty.Register(
"PaintObject", typeof(PaintObject), typeof(PaintCanvas), new PropertyMetadata(OnPaintObjectChanged));
public PaintObject PaintObject
{
get { return this.GetValue(PaintObjectProperty) as PaintObject; }
set
{
this.SetValue(PaintObjectProperty, value);
}
}
private static void OnPaintObjectChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PaintCanvas canvas = (PaintCanvas)d;
// Update stuff
canvas.InvalidateVisual();
}
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
if (PaintObject != null)
{
dc.DrawRectangle(new SolidColorBrush(PaintObject.Color), null, new Rect(0, 0, PaintObject.Width, PaintObject.Height));
}
}
}
:
:<TabControl>
<TabItem DataContext="{Binding PaintViewModel}">
<StackPanel >
<ComboBox ItemsSource="{Binding Colors}" SelectedItem="{Binding Color}" />
<my:PaintCanvas Width="100" Height="100" PaintObject="{Binding PaintObject}" />
</StackPanel>
</TabItem>
</TabControl>
PaintViewModel는 윈도우의 뷰 모델의 속성입니다
class MainViewModel
{
PaintViewModel paintViewModel;
public MainViewModel()
{
paintViewModel = new PaintViewModel();
}
public PaintViewModel PaintViewModel
{
get { return paintViewModel; }
}
...
}
실제 PaintViewModel :
class PaintViewModel : INotifyPropertyChanged
{
PaintObject paintObject;
ObservableCollection<Color> colors = new ObservableCollection<Color>();
Color currentColor;
public PaintObject PaintObject
{
get { return paintObject; }
set { paintObject = value; RaisePropertyChanged("PaintObject"); }
}
public ObservableCollection<Color> Colors
{
get { return colors; }
}
public Color Color
{
get { return currentColor; }
set {
currentColor = value;
RaisePropertyChanged("Color");
paintObject.Color = currentColor;
RaisePropertyChanged("PaintObject");
}
}
// Constructors and INotifyPropertyChanged stuff...
}
색 콤보 상자가 제대로 작동하기 때문에 TabItem이보기 모델에 올바르게 바인딩 된 것 같습니다. 그러나 페인트 개체가 업데이트되고 RaisePropertyChanged ("PaintObject")가 호출 되더라도 PaintCanvas의 DependencyProperty는 절대로 업데이트되지 않습니다. 나는 여기서 무엇을 잘못하고 있니? 난 당신이 PaintObject에 대한 참조를 변경하는 것이 표시되지 않습니다
"PaintCanvas의 DependencyProperty는 절대로 업데이트되지 않습니다"라는 것을 어떻게 알 수 있습니까? 'OnPaintObjectChanged'에 중단 점을 설정 했습니까? 아니면 단순히 색상이 변경되지 않았기 때문입니까? – Clemens
@Clemens : 예, 둘 다 있습니다. :-) – ekholm
(OnPaintObjectChanged 메서드는?, 미안, 동시 주석이라고도 함) – Timores