如何在DataGridTextColumn上使用MultiBinding?

3
我有一个名为ImageDimension的对象,其中包含HeightWidth 2个属性。我想将它们绑定在一起,以便显示像50x60这样的内容(中间带有 x 字符)。我该怎么做?下面的代码导致错误,显示:

"对象引用未设置到对象实例。"

<cst:CustomDataGrid x:Name="grdImageDimension"  
                    ItemsSource="{Binding ImageDimensions, IsAsync=True}"  
   <DataGridTextColumn Header="ImageDimension" Width="50">
      <DataGridTextColumn.Binding>
         <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="ImageDimensions.Height" />
            <Binding Path="ImageDimensions.Width" />                              
         </MultiBinding>
      </DataGridTextColumn.Binding>
   </DataGridTextColumn>
</cst:CustomDataGrid>

视图模型:

Public Class ImageDimensionsVM

    Private m_ImageDimensions As ObservableCollection(Of ImageDimension)
    Public Property ImageDimensions() As ObservableCollection(Of ImageDimension)
        Get
            Return m_ImageDimensions
        End Get
        Set(value As ObservableCollection(Of ImageDimension))
            m_ImageDimensions = value
        End Set
    End Property

您的DataGrid已绑定到一个ImageDimension列表?您在DataContext中有一个ImageDimension?请提供更多信息。 - Giangregorio
@Giangregorio 我已经更新了我的问题并提供了更多信息。正如您所看到的,它是ObservableCollection(Of ImageDimension)。 - Emil
1
所以你不需要绑定到ImageDimensions.Height,只需要绑定到Height即可。 - Giangregorio
1个回答

17

如果你想将数据绑定到ImageDimension对象的属性上,就像 @Giangregorio 指出的那样,直接使用它们即可:

如果您想将数据绑定到 ImageDimension 对象的属性,则只需直接使用它们,如@Giangregorio所指出的那样:
<Window x:Class="DataGridTextHeightWidth.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
   <Grid>
      <DataGrid x:Name="grdImageDimension" ItemsSource="{Binding 
                ImageDimensions, IsAsync=True}" AutoGenerateColumns="False">
         <DataGrid.Columns>
            <DataGridTextColumn x:Name="MyGridColumn"
                                Header="ImageDimension"
                                Width="*">
               <DataGridTextColumn.Binding>
                  <MultiBinding StringFormat="{}{0} x {1}">
                     <Binding Path="Height" />
                     <Binding Path="Width" />
                  </MultiBinding>
               </DataGridTextColumn.Binding>
            </DataGridTextColumn>
         </DataGrid.Columns>
      </DataGrid>
   </Grid>
</Window>

代码后台:

public partial class MainWindow : Window
{
   public MainWindow()
   {
      InitializeComponent(); 

      // Create list
      MyImageDimensionCol col = new MyImageDimensionCol();
      col.ImageDimensions = new ObservableCollection<ImageDimension>();
      col.ImageDimensions.Add(new ImageDimension() { Height = 5, Width = 10 });
      col.ImageDimensions.Add(new ImageDimension() { Height = 15, Width = 20 });
      col.ImageDimensions.Add(new ImageDimension() { Height = 5, Width = 5 });
      DataContext = col;
   }
}

public class MyImageDimensionCol
{
   public ObservableCollection<ImageDimension> ImageDimensions { get; set; }
}

public class ImageDimension
{
   public int Height { get; set; }
   public int Width { get; set; }
}

在这种情况下,它是有效的,但如果该列不是只读的,则无法编辑该值。 - Maxence
如果您删除StringFormat并使用IMultiValueConverter,则可以通过双向绑定使其工作。 - Maxence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接