gpt4 book ai didi

c# - Caliburn.Micro ItemsSource 未绑定(bind)到当前 View 模型,而是绑定(bind)到父级

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:55 25 4
gpt4 key购买 nike

我正在为 WPF 使用 Caliburn.Micro(使用 VS 2012 并面向 .NET 4.5.1)。

我在将 itemsSource 绑定(bind)到 ComboBox 时遇到问题(但我调查了在我的情况下它也发生在其他具有 ItemsSource 属性的控件上,例如 ListBox)。

我有嵌套 View (用户控件)和使用 SimpleContainer (IoC) 创建的 View 模型。

这是我的问题:

组合框填充的项目不是来自其 View View 模型 (LanguageSelectionViewModel) 而是来自父 View View 模型 (TopViewModel)。

此外,当我从父 View 模型中删除项目集合时,我的组合框是空的。

代码:

MainWindowView.xaml:

<Window
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300"
d:DataContext="{d:DesignInstance d:Type=mainWindow:MainWindowViewModel}"
>
<Grid>
<top:TopView

HorizontalAlignment="Stretch"
cal:Bind.Model="{Binding TopVM}"
/>
</Grid>
</Window>

主窗口 View 模型:

public class MainWindowViewModel : Screen
{
private TopViewModel topVm;

public TopViewModel TopVM
{
get { return topVm; }
set
{
topVm = value;
NotifyOfPropertyChange(() => TopVM);
}
}

public MainWindowViewModel(TopViewModel topVm, ContentViewModel contentVm)
{
TopVM = topVm;
TopVM.ConductWith(this);
}
}

顶 View .xaml:

<UserControl>
<StackPanel Orientation="Horizontal">
<languageSelection:LanguageSelectionView cal:Bind.Model="{Binding LanguageSelectionVM}"/>
</StackPanel>
</UserControl>

TopViewModel.cs:

public class TopViewModel : Screen
{
private LanguageSelectionViewModel _languageSelectionVM;

public LanguageSelectionViewModel LanguageSelectionVM
{
get { return _languageSelectionVM; }
set
{
_languageSelectionVM = value;
NotifyOfPropertyChange(() => LanguageSelectionVM);
}
}

public TopViewModel(ClockViewModel clockVm, LanguageSelectionViewModel languageSelectionVM)
{
this.Items = new ObservableCollection<string>() { "a", "a", "a" };

LanguageSelectionVM = languageSelectionVM;
LanguageSelectionVM.ConductWith(this);
}

private ObservableCollection<string> _items;

public ObservableCollection<string> Items
{
get { return _items; }
set
{
_items = value;
NotifyOfPropertyChange(() => Items);
}
}

}

语言选择 View .xaml:

<UserControl>
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding Items}"/>
</StackPanel>
</UserControl>

语言选择 View 模型.cs:

public class LanguageSelectionViewModel : Screen
{
private ObservableCollection<string> _items;

public ObservableCollection<string> Items
{
get { return _items; }
set
{
_items = value;
NotifyOfPropertyChange(() => Items);
}
}

public LanguageSelectionViewModel()
{
this.Items = new ObservableCollection<string>() { "1", "a" };
}
}

后来我也尝试填充这个集合,但没有成功:

    protected override void OnViewReady(object view)
{
base.OnViewReady(view);
this.Items = new ObservableCollection<string>() { "1", "a" };
Refresh();
}

DataContext 似乎没问题,因为绑定(bind)到文本框

<TextBlock Text="{Binding TestString}"/>

工作正常。

最佳答案

好了,谜团解开了。

而不是像这样嵌套控件:

  <Grid>
<top:TopView
cal:Bind.Model="{Binding TopVM}" />
</Grid>

我应该写:

  <Grid>
<ContentControl
cal:View.Model="{Binding TopVM}" />
</Grid>

并且无需强制使用 DataContext。

关于c# - Caliburn.Micro ItemsSource 未绑定(bind)到当前 View 模型,而是绑定(bind)到父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30481018/

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