Wpf 使ViewModel属性可用于绑定到IsChecked

Wpf 使ViewModel属性可用于绑定到IsChecked,wpf,mvvm,binding,caliburn.micro,Wpf,Mvvm,Binding,Caliburn.micro,我正在应用程序中使用Caliburn.Micro。我想做的是: 在视图中为每个可用许可证创建一个单选按钮 检查其许可证当前处于活动状态的许可证 到目前为止,我的ViewModel上有两个属性(我在这里省略了INotify…Changed及其实现,因为这是可行的): BindableCollection可用性事件{get;set;} LicenceInfo ActiveLicense{get;set;} 在ViewModel的构造函数中,我填充availablelicence和activel

我正在应用程序中使用Caliburn.Micro。我想做的是:

  • 在视图中为每个可用许可证创建一个单选按钮
  • 检查其许可证当前处于活动状态的许可证
到目前为止,我的ViewModel上有两个属性(我在这里省略了
INotify…Changed
及其实现,因为这是可行的):

BindableCollection可用性事件{get;set;}
LicenceInfo ActiveLicense{get;set;}
在ViewModel的构造函数中,我填充
availablelicence
activelicense
。到目前为止,一切顺利

当前在视图本身中,我有一个
ItemsControl
,其中包含
单选按钮和一个不可见的
框架元素
,要传递给
MyConverter
,在那里我提取
Self
数据上下文
和不可见的
框架元素
(其
DataContext
绑定到ViewModel)并将其与(覆盖的)
LicenceInfo.Equals()进行比较:


[...]
这实际上是按计划进行的,但在我看来,这是一个丑陋的解决办法,我确信我遗漏了一些东西

使用
作为第二个参数并删除不可见的
框架元素
无效,ViewModel属性未附加到绑定


我不一定要使用
多绑定
。任何类似于Caliburn的操作。也欢迎像处理
选中
事件这样的微操作。有什么想法吗?

从我的观点来看,如果在LicenseViewModel上添加标志不是一个选项,那么您非常接近于一个好的解决方案:

请尝试以下多重绑定,而不是使用容器框架元素:

<MultiBinding Converter="{StaticResource MyConverter}" Mode="OneWay">
    <Binding Path="DataContext" RelativeSource="{RelativeSource Self}" />
    <Binding Path="DataContext.ActiveLicense" RelativeSource="{RelativeSource FindAncestor, AncestorType=ItemsControl}" />
</MultiBinding>

使用与具体类型无关的
Equals()
,修改转换器以比较两个对象。这样,您就不会与不必要的对象混在一起,仍然可以正确地分离视图和视图模型

编辑:

关于带有标志的替代解决方案:我没有注意到,在代码中没有包含LISeNeVIEW模型……添加许可证信息的标志不是一个好的解决方案,我同意。您可以考虑包装<代码> LicenseInfo < /Cult> s内的代码>模型上

LicenseInfo
s的原始集合与包含
ViewModel
s的集合之间的转换

我已经就这个话题给出了详尽的答案

然后,当
ActiveLicense
属性更改时,可以将活动许可证的
ViewModel
的标志设置为true,将所有其他标志设置为false


这是一个特定环境的问题,在这里多做一点是否有意义。如果你不打算随着时间的推移扩展功能等,而且这只是一个简单的许可证选择,第一个解决方案可能就足够了。

LicenseInfo
类中有一个
IsActive
标志将不是一个选项?我是afraid不,在这种情况下不是。即使是这样,也不能解决实际问题。因为我还在学习东西,我非常感兴趣的是如何分别处理这类问题,我错在哪里,我遗漏了什么。你通常会有类似列表框的东西(来自ItemsControl)它有一个
SelectedItem
属性,并将其绑定到您的
activelicense
视图模型属性。我怀疑第二个绑定中的
内容。它不应该只是
?绝对……编辑了它。只需稍加更正(
不编译,所以我使用
),它按预期工作,非常感谢。我很高兴接受这个答案,但您表示,如果向LicenceViewModel添加标志是一个选项,那么会有另一个解决方案。好的,它实际上是一个选项。我不能做的是向
LicenceInfo
类添加标志。@Hannes:我已经编辑了我的答案,也许新的特性有帮助。我不过,我认为您对第一个解决方案很满意。在我问这个问题之前,我还考虑了您建议的附加标志解决方案,包括它的优点和缺点。第一个解决方案的简单性使它非常有吸引力,并且非常适合我在这种特殊情况下的需要,因此这是我将在tim中坚持的在未来,当需求发生变化时,“继续前进”仍然可以实现。