モデルをDependencyProperty
カスタム コントロールとして使用することはできますか? 基本的に名前と描画用のデータポイントのリストを取得する画像ドロワーであるカスタムコントロールを作成したいので、これを行いたいです。
このようなもの:
モデル:
public class Draw : NotificationObject
{
public Draw(string name, List<System.Drawing.PointF> data)
{
Name = name;
Data = data;
}
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
RaisePropertyChanged(() => Name);
}
}
}
private List<System.Drawing.PointF> _data;
public List<System.Drawing.PointF> Data
{
get { return _data; }
set
{
if (_data != value)
{
_data = value;
RaisePropertyChanged(() => Data);
}
}
}
}
}
カスタム コントロール:
public class MyCanvas: System.Windows.Controls.Image
{
static void itemsChangedCallBack(DependencyObject property,
DependencyPropertyChangedEventArgs args)
{
MyCanvas searchTextBox = (MyCanvas)property;
Console.WriteLine("got update");
searchTextBox.Items = (Draw)args.NewValue;
}
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items",
typeof(Draw),
typeof(MyCanvas),new PropertyMetadata(new PropertyChangedCallback(itemsChangedCallBack)));
public Draw Items
{
get { return (Draw)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
}
そしてもちろん XAML:
<myClass:MyCanvas x:Name="Canvas1" Items="{Binding drawModel,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SizX="1600" SizY="200" />
そして ViewModel 呼び出し:
public class MainWindowViewModel : BaseViewModel
{
public Draw drawModel { get; set; }
public MainWindowViewModel()
{
drawModel = new Draw("first", null); // custom control is notified
}
private someFunction() //within another thread but should not matter
{
drawModel.Data = newData; // custom control should be notified but is not
}
}
私の問題は、ViewModel 内で drawModel.Data (プロパティ) を変更すると、カスタム コントロールに通知が届かないことです。モデルの代わりに単純な文字列に対して以前に行ったところ、うまくいきました。drawModel が初めて初期化されたときに機能しますが、後で Data プロパティを更新すると機能しません。