将Item(行)中对象的属性绑定到WPF DataGrid中的DataGridCell属性

时间:2010-08-18 11:07:56

标签: wpf data-binding datagrid styles multibinding

使用Release WPF DataGrid我试图绑定到CellViewModel的属性(当然支持INotifyPropertyChanged)。我将DataGrid的{​​{1}}绑定到类型为ItemsSource的{​​{1}} {继承自Dr.WPF的ObservableCollection RowViewModel类型ObservableDictonary我希望绑定到CellViewModel的属性。

例如,在下面的内容中,我尝试根据CellViewModel布尔属性更改DatagridCell.FontStyle属性的状态(如果CellViewModel.IsLocked则为Italic)。

首先在XAML中公开相关的CellViewModelobject:

IsLocked

RowColumnToCellConverter是

<DataGrid.Resources>

       <cv:RowColumnToCellConverter x:Key="RowColumnToCellConverter"/>

        <MultiBinding x:Key="CellViewModel" Converter="{StaticResource RowColumnToCellConverter}">
            <Binding />
            <Binding RelativeSource="{x:Static RelativeSource.Self}" Path="Column" />
        </MultiBinding>

</DataGrid.Resources>

然后在XAML中创建public class RowColumnToCellConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { RowViewModel<string,CellViewModel> row = values[0] as RowViewModel<string,CellViewModel>; string column = (values[1] as DataGridColumn).SortMemberPath; string col = column.Substring(1, column.Length - 2); return row[col]; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } }

DataTrigger

现在这不起作用,但是我会喜欢做的一个例子,希望它不远。当然, <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <DataTrigger Value="True" > <DataTrigger.Binding > <Binding Path="isLocked" Source="{StaticResource CellViewModel}" /> </DataTrigger.Binding> <Setter Property="FontStyle" Value="Italic"/> </DataTrigger> </Style.Triggers> </Style> </DataGrid.CellStyle> 永远不会在这里设置(因为MultiBinding从不在调试中调用)。

在其他地方,Converter可以工作(虽然我为这篇文章删减了但希望没有引入任何错误),这是MultiBinding/MultiConverter的一部分(不像上面那样作为StaticResource - 是我喜欢))然后它只揭示一个不是自己约束的对象。

那就是我可以有一个转换器的变体,其中返回的对象是 row [col] .Islocked 但是然后没有为PropertyChange通知注册Islocked属性。

现在我不能将DataTrigger/MultiTrigger属性(或者我可以?)添加为原始MultiBind中BindingCollection的第三个绑定语句,因为直到MultiBind返回一个对象,第三个绑定语句没有任何内容< em> {Bind Path = IsLocked} 来引用。

所以我尝试将IsLocked嵌套在以下类似的东西中,因为MultiBinding只接受Binding对象而不接受BindingCollection个对象,所以它不起作用。

MultBinding

希望我的问题应该从上面清楚,即使我尝试的解决方案还很遥远。那我错过了什么? (可能很多,因为我只使用WPF / MVVM几周,这是使用任何DataGrid的一个非常基本的要求,所以我希望答案很简单)。

1 个答案:

答案 0 :(得分:0)

这里的答案与我在other similar question

中提供的答案相同