仅当对象属性为 true 时才绑定 DataGridColumn

Posted

技术标签:

【中文标题】仅当对象属性为 true 时才绑定 DataGridColumn【英文标题】:DataGridColumn binding only if object property is true 【发布时间】:2019-04-04 12:14:59 【问题描述】:

我目前在尝试在 WPF 中进行一些条件绑定时遇到问题。我已经阅读了这个问题,似乎“可见性”并不是 DataGridColumns 的真正选项,因为它不在逻辑树视图中。 我目前有一个对象“设备”,其中包含对象“通道”的列表。这些通道可以是输入或输出,表示为布尔“isInput”。我想要完成的是创建两个数据网格,一个带有输入,一个带有输出。

<DataGrid Grid.Row="0" AutoGenerateColumns="False" ItemsSource="Binding Path=Channels">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="Binding Path=Type" 
             Visibility="Binding Path=(model:Channel.IsInput), 
             Converter=StaticResource BooltoVisibilityConverter"/>
        </DataGrid.Columns>
</DataGrid>

这是我目前拥有的,但由于可见性似乎不起作用,我想要一种方法来在 IsInput=false 时隐藏整行或完全跳过它。

【问题讨论】:

【参考方案1】:

如果你想要多个网格,那么你需要根据需要过滤多个项目集合。

对于您的要求,假设通道对象的总数相对较少,我会做这样的事情。

public class ViewModel: ViewModelBase

    public ViewModel()
    
        AllChannels = new ObservableCollection<Channel>();
        AllChannels.CollectionChanged += (s,e) =>
            
               RaisePropertyChanged(nameof(InputChannels));
               RaisePropertyChanged(nameof(OutputChannels));
           
    

    private ObservableCollection<Channel> AllChanels  get; 

    public IEnumerable<Channel> InputChannels => AllChannels.Where(c => c.IsInput);
    public IEnumerable<Channel> OutputChannels => AllChannels.Where(c => !c.IsInput);

    public void AddChannel(Channel channel)
    
        AllChannels.Add(channel);
    
        

您现在可以创建两个网格控件并将它们的 ItemsSource 属性绑定到 InputChannels 和 OutputChannels。

【讨论】:

谢谢。想知道您是否可以避免创建多个列表,但我想这是这样做的方法:) @StephanFuhlendorff 即使你不打算走完整的 MVVM 路线,分离 U.I. 通常更干净、更容易。来自任何类型的数据逻辑。 当然。我只是担心稍后在尝试编辑频道时会导致问题,所以我试图尽可能长时间地将它们保持在一起:)

以上是关于仅当对象属性为 true 时才绑定 DataGridColumn的主要内容,如果未能解决你的问题,请参考以下文章

仅当它是所需类型时才绑定到接口(否则使用回退)?

仅当定义了值时才向对象添加属性

仅当 Validation 为 True 时才启用 Jbutton

仅当条件为 True 时才在 python 中使用 Eel 调用 JavaScript 函数

Json Schema:仅当深层嵌套对象中存在特定属性时才需要属性

仅当枢轴属性为空时才通过 manyToMany 计算相关模型 - Laravel