2016-02-03 4 views
0

Я хочу иметь CheckBox и в TextBlock вместе в колонке DataGrid так:Добавить два элемента в столбце DataGrid в WPF

<DataGrid CanUserAddRows="False" CanUserDeleteRows="False" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="one"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock x:Name="textBlock1"></TextBlock> 
         <CheckBox x:Name="checkBox1"></CheckBox> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

И я хочу, чтобы связать данные из базы данных в этом столбце: Мои данные в поле базы данных такова: "0-Hello" или "1-Bye"

Если поле было "0-hello" то checkBox1 должен быть снят и textBlock1 должен быть равен "hello".

Если поле было "1-bye", тогда необходимо проверить checkBox1 и textBlock1 должно быть равно "hello".

Как я могу это сделать?

ответ

0

Используйте DataTrigger, чтобы установить флажок и конвертер, чтобы получить подстроку, что вы wan't для просмотра

<DataGrid CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding Items}"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="one" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel > 
          <TextBlock x:Name="textBlock1" Text="{Binding YourProperty,Converter={StaticResource GetSubStringConverter}}"></TextBlock> 
          <CheckBox x:Name="checkBox1" > 
           <CheckBox.Style> 
            <Style TargetType="CheckBox"> 
             <Setter Property="IsChecked" Value="True"/> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding YourProperty[0]}" Value="0"> 
               <Setter Property="IsChecked" Value="False"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </CheckBox.Style> 
          </CheckBox> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

конвертер будет просто извлечь текст для отображения

public class GetSubStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) return null; 
     return value.ToString().Substring(2); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
0

Все, что вам вам необходимо создать конвертер значений для ваших данных:

public class StringBooleanConverter : IValueConverter 
    { 
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
        if(value.ToString() == "0-Hello") 
         return false; 
        else if(value.ToString() == "1-Bye") 
         return true; 
        return false; 
      } 

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
        if(value is bool) 
        { 
          if((bool)value == true) 
            return "1-Bye"; 
          else 
            return "0-Hello"; 
        } 
        return "no"; 
      } 
    } 

И назовите его в своем XAML:

<DataGrid CanUserAddRows="False" CanUserDeleteRows="False" > 
    <DataGrid.Resources> 
     <local:StringBooleanConverter x:Key="StringBooleanConverter" /> 
    </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="one"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock x:Name="textBlock1"></TextBlock> 
          <CheckBox x:Name="checkBox1" IsCheked="{Binding Path=YourBooleanProperty, Converter={StaticResource StringBooleanConverter}}"></CheckBox> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

Примечание: не используйте foget для локального пространства имен decalre в вашем окне.

<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:YourConveterNameSpace" 
     > 
    //... 
</Window> 
+0

Большое спасибо – Mary

0

Вы можете использовать пользовательские IValueConverter для разбора строки в текст, который вы хотите, или логическое значение:

<DataGrid CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding Data}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="one"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock x:Name="textBlock1" Text="{Binding DataString, Converter={StaticResource DataToTextConverter}}" /> 
         <CheckBox x:Name="checkBox1" Text="{Binding DataString, Converter={StaticResource DataToBooleanConverter}}"/> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

И в ваших ресурсах:

<UserControl.Resources> 
    <local:DataToTextConverter x:Key="DataToTextConverter"/> 
    <local:DataToBooleanConverter x:Key="DataToBooleanConverter"/> 
</UserControl.Resources> 

и код позади:

[ValueConversion(typeof(String), typeof(String))] 
public class NotificationSeverityColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     //strip the first two characters 
     return parsedString; 
    } 
} 
+0

Большое спасибо – Mary

Смежные вопросы