WPF - 绑定到同一控件实例的两个用户控件的内容

WPF - Content of two user controls bound to same instance of control

我有一个 wpf/c# 申请。; 我有一个列表框,根据所选项目显示特定视图。 我有一个视图显示所有和不同的值。 视图如下所示:

<UserControl.Content>
    <Binding Path="DisplayControl" UpdateSourceTrigger="PropertyChanged"/>
</UserControl.Content>

DisplayControl 是列表框项的视图模型中的一个 UserControl(我知道它不是最好的,但目前不能更改)。 它在所有列表框项目之间共享。 最后一个列表框项目(调用 DisplayControl 集 属性 的最后一个)是在单击时显示视图的项目 - 所有其他项目都显示为空白。

问题是什么?它们的绑定方式相同,为什么最后一个只显示控件,我该如何解决?

WPF 中的一个控件一次只能有一个 parent。事实上,它一次只能在一个地方。您正在快速连续给 DisplayControl 两个不同的 parent。第二个是它结束的地方。

您实际上想完成什么?在程序规范术语中,不是 "I'm trying to pound a nail with a live dog because the birthday cake didn't work as a shovel"。您是否希望 DisplayControlcontent 同时显示在两个不同的地方?这是可行的。

无论如何,首要任务是不要在您的视图模型中存储任何 UserControl。这可以而且必须改变。您要在 UserControl 中放置某种内容,对吗?这就是它的用途,对吧?因此,在您的视图模型中包含 content,并使用模板将其显示在视图中的一个或多个 UserControl 中。

您在尝试让这个水管工的噩梦开始工作时浪费的时间越多,情况就会变得越糟。 Sunk Cost Fallacy 不是你的朋友。但对于大多数人来说,只有一种方法可以了解它。

我认为你应该尝试这样的事情:

ViewModel.cs

public TypeModel
{
    private string _label;
    public string Label{ MVVM stuff}

    private UserControl _userControl;
    UserControl UserControl { MVVM stuff }
}

public class toto
{
private ObservableCollection<TypeModel> _list;
public ObservableCollection<TypeModel> List
{
get{return this._list;}
set { set value and notifyPropertyChanged }
}

private TypeModel _selectedItem;
public TypeModel SelectedItem
{
get{ return this._selectedItem;}
set { set value and NotifyPropertyChanged }
}

}

在你的view.xaml

<listbox normal binding to List + selectedItem binding>
<ContentControl Binding={SelectedItem.UserControl} >

这只是伪代码,请尝试像这样坚持您现有的代码:)

顺便说一句:@Ed Plunkett 是对的。