我創建了一個自定義控件「CustomAutoCompleteBox」(它繼承AutoCompleteBox)與一個依賴項屬性「CurrentItem」。依賴屬性未設置ViewModel
public static readonly DependencyProperty CurrentItemProperty =
DependencyProperty.Register("CurrentItem", typeof(CityEntity), typeof(CustomAutoCompleteBox),
new FrameworkPropertyMetadata(
null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public CityEntity CurrentItem
{
get { return (CityEntity)GetValue(CurrentItemProperty); }
set { SetValue(CurrentItemProperty, value); }
}
此自定義控件還有一個屬性「InternalCurrentItem」。
public CityEntity InternalCurrentItem
{
get { return _internalCurrentCity; }
set
{
if (_internalCurrentCity == value) return;
_internalCurrentCity = value;
OnPropertyChanged();
CurrentItem = value;
}
}
DataContext的是確定自己在構造函數中:
public VilleAutoCompleteBox()
{
DataContext = this;
...
}
並將該樣式設置的ItemsSource和的SelectedItem這樣的:
<Style TargetType="{x:Type infrastructure_controls:CustomAutoCompleteBox}" BasedOn="{StaticResource AutoCompleteBoxFormStyle}">
<Setter Property="ItemsSource" Value="{Binding InternalItems, Mode=OneWay}" />
<Setter Property="SelectedItem" Value="{Binding InternalCurrentItem, Mode=TwoWay}" />
...
</Style>
總之,ItemsSource時是結合內部屬性「InternalItems」和SelectedItem綁定到內部屬性「InternalCurrentItem」。
對於使用它,我宣佈這個CustomAutoCompleteBox這樣的:
<infrastructure_usercontrols:CustomAutoCompleteBox Width="200" CurrentItem="{Binding DataContext.VmCurrentItem, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Mode=TwoWay}" />
我已經綁定依賴屬性「CURRENTITEM」到視圖模型的財產「VmCurrentItem」。
一切工作正常,除了一件事。
當我在控件中鍵入文本時,InternalCurrentItem屬性正確更改。我的ViewModel中的CurrentItem屬性相同。
具體而言,InternalCurrentItem被正確修改(Set)。此屬性設置CurrentItem依賴項屬性,並且此依賴項屬性設置VmCurrentItem。
相反是不正確的。如果我直接更改ViewModel中VmCurrentItem屬性的值,則CurrentItem屬性不會更改。我不懂爲什麼。
作爲一個說明,一般情況下不應設置控件的DataContext本身,因爲它可以防止,控制繼承的DataContext的其父控制或窗口。當您查看CurrentItem綁定的複雜性時,您可以輕鬆找到此規則的證明。最好只用RelativeSource編寫控件的「內部」綁定。見例如此答案:https://stackoverflow.com/a/28982771/1136211 – Clemens
我已根據您的建議更新了我的代碼。這是更清潔,但不解決問題。 – StevenPF