gpt4 book ai didi

c# - 用户控件使用了错误的 Datacontext

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:22 26 4
gpt4 key购买 nike

我有一个以这种方式在父控件中使用的 UserControl:

<Views:TranslationTextInput  Translation="{Binding SelectedEntity.Name}"/>

父控件 DataContext 是一个包含 SelectedEntity 属性的 ViewModel。

在我的子 UserControl 中,我定义了一个新的 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 });

执行时出现绑定(bind)错误:

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')

似乎在子 UserControl 的 Viewmodel 上查找了 SelectedEntity,但应该使用父 ViewModel 的 Property。我该如何解决这个问题?

编辑:

    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");
}

最佳答案

您真的不应该从 UserControl 内部设置 UserControlDataContext。通过这样做,您将阻止任何其他 DataContext 传递给 UserControl,这在某种程度上破坏了 WPF 具有单独的 UI 和数据层的最大优势之一。

创建 UserControl 时,您将 DataContext 设置为新的 TranslationTextInputViewModel,而 TranslationTextInputViewModel 没有名为 SelectedEntity,因此您的绑定(bind)失败。

我的建议?不要在 UserControl 中设置 DataContext

如果您希望将特定的 ViewModel 用于特定的 UserControl,请将其添加到您的 ParentViewModel 并将其作为 DataContext 传入,例如:

<Window.Resources>
<DataTemplate DataType="{x:Type vm:TranslationTextInputViewModel}">
<Views:TranslationTextInput />
</DataTemplate>
</Window.Resources>

或者这个:

<Views:TranslationTextInput 
DataContext="{Binding SelectedTranslationTextInputViewModel}" />

或者,如果您的 ViewModel 包含特定于 UserControl 本身的功能并且不应该成为您的应用程序层的一部分,请将该代码放在 的代码隐藏中UserControl 并完全摆脱 ViewModel

关于c# - 用户控件使用了错误的 Datacontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12819044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com