【问题标题】:Datagrid row IsSelected bindingDatagrid 行 IsSelected 绑定
【发布时间】:2011-04-06 11:26:18
【问题描述】:

我想在我的 ViewModel 中绑定一个布尔字段,以便在选择数据网格中的一行时设置为 true。

所以我使用了 Style 技巧。那在我的主题中使用:

然后在 Datagrid 的 XAML 标记中: ItemContainerStyle = "{DynamicResource ItemSelection}"

但对我来说,这似乎很糟糕。我不希望在我的样式区域中发生属性绑定。有一个更好的方法吗?好像没有办法直接绑定到行的 IsSelected 值?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    如果您只想在网格中选择一行时将视图模型中的布尔属性设置为 true,那么您只需将表示数据源中模型的第一个属性绑定到网格属性“SelectedItem” .

    之后,您的布尔属性只需要一个 get 来返回与您的第一个属性的 null 的比较。

    例如:

    private MyModel __selectedItem;
    public MyModel SelectedItem
    {
        get {   return _selectedItem; }
        set { 
                if (_selectedItem != value)
                {
                    _selectedItem = value;
                    RaisePropertyChange("SelectedItem");
                }
            }
     }
    
     public bool IsItemSelected => SelectedItem != null;
    

    【讨论】:

      【解决方案2】:

      我同意这项技术很混乱。我编写了一个 MultiSelectCollectionView 类,它可能会有所帮助 - 你可以在这里找到它:http://grokys.blogspot.com/2010/07/mvvm-and-multiple-selection-part-iii.html

      您可能还想阅读该系列的前几篇文章,以了解 Style/IsSelected 技术的问题。

      【讨论】:

        【解决方案3】:

        好吧,我不会说这是“非常糟糕的形式”。我觉得还可以。

        为简单起见,以 ListBox 为例。如果您手动向其中添加项目,您最终会得到这样的结果:

        <ListBox>
          <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item1</ListBoxItem>
          <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item2</ListBoxItem>
          <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item3</ListBoxItem>
        </ListBox>
        

        这看起来“不错”吧?您直接从实际控件(即 ListBoxItems)绑定到 ViewModel 中的属性。这在一定程度上回答了你的问题。这是绑定 IsSelected 属性的另一种方式。不过,您必须手动将项目添加到控件中。而且我不确定您将如何在 DataGrid 中执行此操作。

        现在,如果您要为 ListBox(或与之相关的 DataGrid)指定一个 ItemsSource,您在某种程度上是在告诉 ListBox 为您自动生成 ListBoxItems。由于您希望 所有 ListBoxItems 的“IsSelected”属性绑定到您的 ViewModel,因此在 Style 中定义它非常有意义。

        【讨论】:

        • 它似乎只是将我的绑定和事件逻辑分散到多个区域(因为我在外部 XAML 中使用主题,所以我必须将绑定放在那里)。字段、命令等的其他绑定不必按照我的风格进行。因此,几个月后我可能会寻找而不是去明显的地方,这似乎是一个例外。
        猜你喜欢
        • 2013-02-01
        • 2020-08-05
        • 2022-07-09
        • 1970-01-01
        • 2011-05-05
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        相关资源
        最近更新 更多