【发布时间】:2014-04-19 14:57:53
【问题描述】:
我在我的应用程序中使用 Caliburn.Micro。我想做的是:
- 在视图中为每个可用许可证创建一个 RadioButton
- 检查其许可证当前处于活动状态的那个
到目前为止,我的 ViewModel 上有两个属性(我在这里省略了 INotify...Changed 及其实现,因为它有效):
BindableCollection<LicenceInfo> AvailableLicences { get; set; }
LicenceInfo ActiveLicence { get; set; }
在 ViewModel 的构造函数中,我填充了 AvailableLicences 和 ActiveLicence。到目前为止,一切顺利。
目前在视图本身中,我有一个 ItemsControl,其中包含 RadioButtons 和一个不可见的 FrameworkElement 以传递给 MyConverter,在那里我提取了 Self 的 DataContexts 和不可见的FrameworkElement(其 DataContext 绑定到 ViewModel)并将它们与(覆盖)LicenceInfo.Equals() 进行比较:
<FrameworkElement Name="ActiveLicence" Visibility="Collapsed" />
<ItemsControl Name="AvailableLicences">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton cal:Message.Attach="[Event Checked] = [Action ChangeActiveLicence($dataContext)]">
<RadioButton.IsChecked>
<MultiBinding Converter="{StaticResource MyConverter}" Mode="OneWay">
<Binding RelativeSource="{RelativeSource Self}" />
<Binding ElementName="ActiveLicence" />
</MultiBinding>
</RadioButton.IsChecked>
[...]
这实际上按预期工作,但在我看来这是一个丑陋的解决方法,我确信我错过了一些东西。
使用<Binding x:Name="ActiveLicence" /> 或<Binding Path="ActiveLicence" /> 作为第二个参数并删除不可见的FrameworkElement 不起作用,ViewModel 属性未附加到绑定。
我不一定会使用MultiBinding。任何类似于 Caliburn.Micro 操作(例如处理 Checked 事件的操作)也将受到欢迎。有什么想法吗?
【问题讨论】:
-
在
LicenceInfo类中只使用IsActive标志不是一种选择吗? -
恐怕不,在这种情况下不是。即使是这样,那也不能解决实际问题。由于我还在学习东西,我会对如何分别处理这类问题非常感兴趣,我哪里错了,或者我错过了什么。
-
你通常会有一个类似于 ListBox(它从 ItemsControl 派生)的东西,它有一个
SelectedItem属性并将它绑定到你的ActiveLicence视图模型属性。
标签: wpf mvvm binding caliburn.micro