gpt4 book ai didi

wpf - 使 ViewModel 属性可用于绑定(bind)到 IsChecked

转载 作者:行者123 更新时间:2023-12-03 10:37:16 26 4
gpt4 key购买 nike

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

  • 在 View
  • 中为每个可用许可证创建一个 RadioButton
  • 检查其许可证当前处于事件状态的

  • 到目前为止,我的 ViewModel 上有两个属性(我在这里省略了 INotify...Changed 及其实现,因为它有效):

    BindableCollection<LicenceInfo> AvailableLicences { get; set; }
    LicenceInfo ActiveLicence { get; set; }

    在 ViewModel 的构造函数中,我填充了 AvailableLicencesActiveLicence .到现在为止还挺好。

    目前在 View 本身中,我有一个 ItemsControl其中包含 RadioButton s 和一个看不见的 FrameworkElement转至 MyConverter ,我在其中提取 DataContextSelf和看不见的 FrameworkElement (其 DataContext 绑定(bind)到 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 属性未附加到绑定(bind)。

    我不一定要使用 MultiBinding .任何类似于 Caliburn.Micro 操作的操作,例如处理 Checked 的操作。事件也将受到欢迎。有任何想法吗?

    最佳答案

    从我的角度来看,如果在 LicenceViewModel 上添加标志不是一个选项,那么您在这里非常接近一个很好的解决方案:

    不要使用容器框架元素,请尝试以下多重绑定(bind):

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

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

    编辑:

    关于带有标志的替代解决方案:我没有注意到,您的代码中没有涉及 LicenseViewModel ......我同意向许可证信息添加标志不是一个好的解决方案。您可以考虑将 LicenseInfo里面 LicenseInfoViewModel s,尽管这需要一些基础设施来实现 LicenseInfo 的原始集合之间的同步。 s 在模型和包含 ViewModel 的集合上s。

    我已经发布了关于该主题的广泛答案 here .

    然后您可以设置事件许可证的标志 ViewModelActiveLicense 为真而所有其他为假时属性变化。

    这是一个具体背景的问题,在这里加倍努力是否有意义。如果您不打算随着时间的推移扩展功能等,并且它只是一个简单的许可证选择,那么第一个解决方案可能就足够了。

    关于wpf - 使 ViewModel 属性可用于绑定(bind)到 IsChecked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402954/

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