我有一个是在这样一个家长控制使用的用户控件:
<Views:TranslationTextInput Translation="{Binding SelectedEntity.Name}"/>
父控制的DataContext是包含SelectedEntity属性一个ViewModel。
在我的孩子我用户控件定义一个新的视图模型作为在DataContext:
<UserControl.DataContext>
<vm:TranslationTextInputViewModel x:Name="vm"></vm:TranslationTextInputViewModel>
</UserControl.DataContext>
在我后面的代码有:
public static readonly DependencyProperty TranslationProperty = DependencyProperty.Register("Translation", typeof(Translation),typeof(UserControl));
// .NET Property wrapper
public Translation Translation
{
get { return (Translation)GetValue(TranslationProperty); }
set { SetValue(TranslationProperty, value); }
}
public TranslationTextInput(){
InitializeComponent();
DataContext = new TranslationTextInputViewModel();
SetBinding(TranslationProperty, new Binding { Path = new PropertyPath ("Translation"), Mode = BindingMode.OneWayToSource });
当执行我得到一个绑定错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedEntity' property not found on 'object' ''TranslationTextInputViewModel' (HashCode=49954236)'. BindingExpression:Path=SelectedEntity.Name; DataItem='TranslationTextInputViewModel' (HashCode=49954236); target element is 'TranslationTextInput' (Name='InputControl'); target property is 'Translation' (type 'Translation')
看来SelectedEntity是抬头对孩子UserControl的视图模型,而应采用父视图模型的财产。 我该如何解决这个问题?
编辑:
public TranslationTextInputViewModel()
{
//EnglishTranslation = tranlsations["en"];
}
public string EnglishTranslation
{
get
{
if (!Translation.TranslationDict.ContainsKey(new CultureInfo("en").LCID))
Translation.Translations.Add(new TranslationItem() { Text = "", Lcid = new CultureInfo("en").LCID });
return Translation.TranslationDict[new CultureInfo("en").LCID].Text;
}
set
{
Translation.TranslationDict[new CultureInfo("en").LCID].Text = value;
}
}
public string SelectedTranslation
{
get
{
if (!Translation.TranslationDict.ContainsKey(_selectedLanguage))
Translation.Translations.Add(new TranslationItem() { Text = "", Lcid = _selectedLanguage });
return Translation.TranslationDict[_selectedLanguage].Text;
}
set
{
Translation.TranslationDict[_selectedLanguage].Text = value;
}
}
private Translation _translation;
public Translation Translation
{
get
{
if (_translation == null)
_translation = new Translation();
return _translation; }
set { _translation = value; }
}
private int _selectedLanguage;
public int SelectedLanguage
{
get
{
return _selectedLanguage;
}
}
public List<CultureInfo> AvailableLanguages
{
get
{
return (from x in PqsLocalization.AvailableLanguages where x.Name != "en" select x).ToList();
}
}
public RelayCommand<int> LanguageChanged { get; private set; }
private void LanguageChangedExecute(int lang)
{
_selectedLanguage = lang;
RaisePropertyChanged("SelectedLanguage");
RaisePropertyChanged("SelectedTranslation");
}