我一直在努力使這一障礙在WPF中,我想我已經找到了解決辦法,雖然難看。綁定依賴項屬性爲當前DataContext屬性
的情況如下:
- 我有一個自定義依賴屬性的自定義用戶控件。
- 用戶控件可以嵌套在我的其他用戶控件內。
- 我的每個用戶控件都有一個由定位器指定的數據上下文(我遵循MVVM模式)
- 我想將自定義依賴項屬性綁定到父視圖模型中的值。
代碼...
父視圖
<UserControl DataContext="{Binding Source={StaticResource Locator}, Path=ParentControlLocator}">
<my:Child Demo="{Binding Path=DataContext.DemoTextAlpha, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl, AncestorLevel=1}}" />
</UserControl>
父類視圖模型
public class ParentClassViewModel : BaseViewModel
{
private string _demoTextAlpha = "Some Alpha text";
public string DemoTextAlpha
{
get
{
return this._demoTextAlpha;
}
set
{
this._demoTextAlpha = value;
this.NotifyPropertyChange("DemoTextAlpha");
}
}
}
子視圖
<UserControl DataContext="{Binding Source={StaticResource Locator}, Path=ChildControlLocator}">
<TextBlock Text="{Binding Path=SomeProperty}" />
</UserControl>
兒童查看代碼背後
public partial class Child : UserControl
{
public Child()
{
InitializeComponent();
}
public static readonly DependencyProperty DemoProperty =
DependencyProperty.Register("Demo",
typeof(string),
typeof(Child),
new FrameworkPropertyMetadata()
{
PropertyChangedCallback = OnDemoChanged,
BindsTwoWayByDefault = true
});
public string Demo
{
get { return this.GetValue(DemoProperty).ToString(); }
set { this.SetValue(DemoProperty, value); }
}
private static void OnDemoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (Child)d;
var viewModel = (ChildViewModel)control.DataContext;
viewModel.SomeProperty = (string)e.NewValue;
}
}
子視圖模式
public class ChildViewModel : BaseViewModel
{
private string _someProperty;
public string SomeProperty
{
get
{
return _someProperty;
}
set
{
_someProperty = value;
this.NotifyPropertyChange("SomeProperty");
}
}
}
好了,所以這WORKS。我試圖達到的是更好/更優雅的代碼,特別是關於這個聲明。
<my:Child Demo="{Binding Path=DataContext.DemoTextAlpha, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl, AncestorLevel=1}}" />
即使我能忍受,儘量優雅的推移,但有一點是困擾我現在的問題是,當我鍵入
Path=DataContext.DemoTextAlpha
當我嘗試向下鑽取智能感知下降在DataContext中。所以我必須格外小心地輸入正確的東西。
那麼 - 有什麼不同的方式,使在DataContext的屬性出現在智能感知,或者是有另一種方式來實現這一目標,我現在在做同樣的事情?
謝謝。
EDIT到澄清
當我把這樣的事情,而不是指定的相對源如在上述實施例...
<my:Child Demo="{Binding DemoTextAlpha}"/>
我收到錯誤...
System.Windows.Data Error: 40 : BindingExpression path error: 'DemoTextAlpha' property not found on 'object' ''ChildViewModel' (HashCode=34126977)'. BindingExpression:Path=DemoTextAlpha; DataItem='ChildViewModel' (HashCode=34126977); target element is 'Child' (Name=''); target property is 'Demo' (type 'String')
請檢查我的編輯到OP看到我的澄清...我試圖把它放在評論中,但我無法正確格式化。 – imdandman 2013-04-08 16:44:44
@imdandman看到我的編輯。 – 2013-04-08 17:00:56
Drat!我忽略的另一件事。 你所說的是我一直在做的事情。我在構造函數中引用了其他虛擬機,當我需要填充數據時,我只是這樣做了。 但是,當我需要將2x的ChildControl放置在同一父級中時,我遇到了此問題。那有意義嗎? – imdandman 2013-04-08 17:05:08