簡體   English   中英

如何在WPF中動態更改DataGridTextColumn綁定上的轉換器?

[英]How can I dynamically change the converter on DataGridTextColumn binding in WPF?

我真的不了解WPF和XAML,並且繼承了一些編寫得很糟糕的代碼,所以我可能會對此一清二楚。

我繼承了綁定到Person對象列表的DataGrid(在后面的代碼中),其中在XAML中指定了必需的DataGridTextColumns(大概是允許樣式化)。

<DataGrid x:Name="PersonGrid" ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=LastName}" MaxWidth="Infinity" MinWidth="150" Header="Last Name">
        <DataGridTextColumn Binding="{Binding Path=FirstName}" MaxWidth="Infinity" MinWidth="150" Header="First Name" />
        <DataGridTextColumn Binding="{Binding Path=DOB, StringFormat=\{0:MM/dd/yyyy\}}" MaxWidth="Infinity" MinWidth="200" Header="Date of Birth (MM/DD/YYYY)" />
        <DataGridTextColumn Binding="{Binding Path=Number}" MaxWidth="Infinity" MinWidth="150" Header="(P)erson Number" />
    </DataGrid.Columns>
    <DataGrid.DataContext>
        <dm:Person />
    </DataGrid.DataContext>
</DataGrid>

我想僅顯示該人的最后一個姓名縮寫,也可以根據復選框的狀態顯示。

<CheckBox Name="ShowFullNames_CheckBox" Content="Show Full Names" IsChecked="False"/>

我能夠在后面的代碼中將轉換器連接到LastName Binding,但是在綁定數據后嘗試更改該轉換器時,出現錯誤(“綁定已使用后無法更改。”)。

我以為也許我也可以將復選框IsChecked狀態綁定到ConverterParameter或Multibinding的一個綁定,但是無法使其工作。

<DataGridTextColumn MaxWidth="Infinity" MinWidth="150" Header="Last Name">
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="myStringTruncator">
            <Binding Source="ShowFullNames_CheckBox" Path="IsChecked"/>
            <Binding Path="LastName"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

在myStringTruncator的Convert方法中,第一個綁定僅填充了DependencyProperty.UnsetValue,而不是復選框的值。

我可能沒有找到一種非常簡單的方法來執行此操作。 有任何想法嗎?

您可以將轉換器添加到XAML中的綁定中。

<DataGridTextColumn Binding="{Binding Path=LastName, Converter={StaticResource YourConverter}"
                    MaxWidth="Infinity"
                    MinWidth="150"
                    Header="Last Name">

但是要綁定復選框的狀態,您將必須使用類似以下內容(未經測試)

<DataGridTextColumn Header="Last Name">
  <DataGridTextColumn.Binding>
    <MultiBinding Converter="{StaticResource NameAndCheckBoxMultiValueConverter}">
      <Binding Path="LastName" />
      <Binding ElementName="myCheckBox" Path="IsChecked" />
    </MultiBinding>
  </DataGridTextColumn.Binding>
 </DataGridTextColumn>

和轉換器:

  using System;
    using System.Globalization;
    using System.Windows.Data;

    namespace TestWpf
    {
        public class NameAndCheckBoxMultiValueConverter: IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
            var lastName = values[0] as String;
            if(lastName != null)
            {
                var isChecked = (bool)values[1];
                if (isChecked)
                {
                    return lastName.Substring(0,1);
                }
                return lastName;
            }
            return null;
            }

            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM