我有一個簡單的WPF窗口,其中包含一個帶有顏色的組合框和一個帶有該顏色的自定義畫布矩形的TabItem。在我PaintCanvas我有這樣一個DependencyProperty:DependencyProperty沒有更新
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));
}
}
}
的PaintObject依賴屬性在XAML綁定到其相應的財產PaintViewModel:
<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從不更新。我在這裏做錯了什麼?
你怎麼知道「PaintCanvas中的DependencyProperty永遠不會被更新?」?你在OnPaintObjectChanged中設置了一個斷點,還是因爲顏色沒有改變? – Clemens 2012-08-08 08:46:02
@Clemens:是的,都是。 :-) – ekholm 2012-08-08 08:46:43
(OnPaintObjectChanged方法是否被調用?,對不起,同時發表評論) – Timores 2012-08-08 08:47:21