WPF 属性值绑定、转换


TextBlock绑定属性

绑定单个属性及转换器

<UserControl.Resources>
    <cvt:StateConv x:Key="stateConv"/>
</UserControl.Resources>
...
<TextBlock Text="{Binding Name, StringFormat={}{0:F2}, Converter="{StaticResource stateConv}"}"/>
using System;
using System.Globalization;
using System.Windows.Data;
public class StateConv: IValueConverter
{
    // 此文本将显示在控件中(比如:TextBox)
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int type = 0;
	string rslt = string.Empty;
        if (int.TryParse(value.ToString(), out type))
        {
            if (type == 1) { rslt = "正常"; }
            else { rslt = "异常"; }   
        }
        return rslt;                            
    }
    // 目标数据格式转换为原数据格式(正常->1)
    // 当您更改控件TextBox的值时,ConvertBack方法将在绑定再次触发时调用(默认OnFocusLost)
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value?.ToString()))
                return -1;
            
        var item = TypeResource.FirstOrDefault(x => x.DisplayText == value.ToString());
        if (item == null)
        {
           return -1;
        }
        return item.Key;
    }
}

转换器2

数值转换,显示指定枚举类型的文本描述

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value != null && int.TryParse(value.ToString(), out int type))
    {
        if (Enum.IsDefined(typeof(PropertyNameEnumType), type))
        {
            var @enum = (PropertyNameEnumType)type;
            return @enum.GetEnumDescription();
        }
    }
    return "未知状态";
}

多重绑定1

<Label.Content>
    <TextBlock>
	<TextBlock.Text>
		<MultiBinding StringFormat="{}{0}({1})">
			<Binding Path="Name1" TargetNullValue="用默认值来显示为空的字段" />
			<Binding Path="Name2" />
		</MultiBinding>
	</TextBlock.Text>
    </TextBlock>
</Label.Content>

StringFormat要求它的目标是string类型。 可在指定控件内嵌套TextBlock进行自定义格式转换。
若要体现动态数据,属性所属类需要实现INotificationPropertyChanged接口,绑定的属性可以响应属性更改事件。

多重绑定2

<UserControl.Resources>
    <cvt:MultiStateConv x:Key="multiStateConverter"/>
    <cvt:MultiVersionTypeConv x:Key="multiVersionTypeConverter"/>
</UserControl.Resources>
...
<TextBlock>
    <TextBlock.Content>
        <MultiBinding Converter="{StaticResource multiStateConverter}">
            <Binding Path="Name"/>
            <Binding Path="Name2"/>
        </MultiBinding>
    </TextBlock.Content>
</TextBlock>

<DataGridTextColumn Header="版本类型" Width="*">
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource multiVersionTypeConverter}" ConverterParameter="{StaticResource multiStateConverter}">
            <Binding Path="Type1"/>
            <Binding Path="Type2"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
using System;
using System.Globalization;
using System.Windows.Data;

[ValueConversion(typeof(object[]), typeof(string))]
class MultiStateConv : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var cvt = parameter as MultiStateConv;
        string rslt = string.Empty;
        if (int.TryParse(values[0].ToString(), out int type))
        {
            //...             
        }
        if (int.TryParse(values[1].ToString(), out int type2))
        {
            //...
        }
        return rslt;                           
    }

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

可直接调用资源词典

Converter.xaml

{Binding Converter={StaticResource Boolean2VisibilityConverter}}

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:converter="clr-namespace:XXX.Converters">
    <BooleanToVisibilityConverter x:Key="Boolean2VisibilityConverter"/>
    ......
</ResourceDictionary>

DataGrid中,编辑状态下触发事件

<DataGridTextColumn  Width="auto" IsReadOnly="False"  MinWidth="110"  Binding="{Binding Name}" Header="名称">
    <DataGridTextColumn.EditingElementStyle>
        <Style TargetType="TextBox">
            <EventSetter Event="TextChanged" Handler="DataGridTextColumn_Name_TextChanged"/>
            <EventSetter Event="LostFocus" Handler="DataGridTextColumn_Name_LostFocus"/>
        </Style>
    </DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>

RadioButton绑定属性

<UserControl.Resources>
    <cvt:RadioCheckConv x:Key="radioCheckConverter"/>
</UserControl.Resources>

<RadioButton Content="XXX" HorizontalAlignment="Center" GroupName="GroupName1" 
             IsChecked="{Binding PropertyName1, Converter={StaticResource radioCheckConverter}, ConverterParameter=1}"/>

其中,属性PropertyName1是可通知的;

using System;
using System.Windows.Data;
public class RadioCheckConv : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
      if (value == null || parameter == null)
      {
          return false;
      }
      if (value.ToString().Equals(parameter.ToString()))
      {
          return true;
      }
      return false;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
      if (value == null || parameter == null)
      {
          return null;
      }
      if ((bool)value)
      {
          return parameter.ToString();
      }
      return null;
  }
}

TextBox绑定属性

<TextBox x:name="txt" Text="{Binding PropertName, Mode=TwoWay, UpdateSourceTrigger=Default}" />

控件绑定属性时,UpdateSourceTrigger默认为Default。源PropertName不会随着Text属性的改变而立即更新;TextBox中的变化并不是立即传递到源,而是在TextBox失去焦点后,源才更新。

UpdateSourceTrigger枚举 说明 备注
Default 默认值 默认为LostFocuse
Explicit 当应用程序调用 UpdateSource 方法时生效 通过代码手动推送来更新
LostFocus 失去焦点的时候触发
PropertyChanged 属性改变的时候触发 源会立即更新
using System.Windows.Data;
private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
{
    // Explicit时,手动更新绑定的属性
    BindingExpression binding = txt.GetBindingExpression(TextBox.TextProperty);
    binding.UpdateSource();
}

后台绑定

<cvt:IntToBoolConv x:Key="intToBoolConverter"/>
<CheckBox Content="启用" x:Name="CheckBox1"
   IsChecked="{Binding IsEnable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource intToBoolConverter}}" />

this.DataContext = this;  // Prism可省略此步;此时IsEnable可通知客户端即可,不要求是依赖属性propdp

相当于后台实现

<CheckBox Content="启用" x:Name="CheckBox1"  />
using System.Windows.Data;
BindingOperations.SetBinding(CheckBox1,   // 控件名称
    CheckBox.IsCheckedProperty,           // 控件属性
    new Binding                           // 绑定内容
    {
        Path = new PropertyPath("IsEnable"), // 依赖属性 IsEnable
        Mode = BindingMode.TwoWay,
        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
        Converter = new IntToBoolConv(),
        Source = this,                    // 属性所属对象
    });


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM