为什么绑定不起作用?

所以我创建了一个带有“ShowCode”属性的userControl来学习如何使用属性。我想要这个属性隐藏网格中的第二行。为什么绑定不起作用?

查看:

<UserControl x:Class="Test.UserControl1" 

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="300">

<Grid Margin="0,0,0,0" Name="outergrid" DataContext="{Binding}">

<Grid.RowDefinitions>

<RowDefinition Height="3*" />

<RowDefinition Height="1*" />

</Grid.RowDefinitions>

<ContentControl Name="XAMLView" Grid.Row="0"/>

<GridSplitter ResizeDirection="Rows"

Grid.Row="0"

VerticalAlignment="Bottom"

HorizontalAlignment="Stretch" />

<Border Width="11" Grid.Row="1" Background="Black" />

</Grid>

代码:

public partial class UserControl1 : UserControl 

{

public UserControl1()

{

InitializeComponent();

outergrid.RowDefinitions[1].SetBinding(RowDefinition.HeightProperty, new Binding() { Path = new PropertyPath("ShowCode"), Source = this, Converter = new BoolToHeightConverter(), ConverterParameter = "True" });

}

public bool ShowCode

{

get { return (bool)GetValue(ShowCodeProperty); }

set { SetValue(ShowCodeProperty, value); }

}

public static readonly DependencyProperty ShowCodeProperty =

DependencyProperty.Register("ShowCode",

typeof(bool),

typeof(UserControl1),

new PropertyMetadata(true, new PropertyChangedCallback(OnShowCodeChanged)));

static void OnShowCodeChanged(object sender, DependencyPropertyChangedEventArgs args)

{

UserControl1 source = (UserControl1)sender;

//source.outergrid.RowDefinitions[1].Height =

}

public class BoolToHeightConverter : IValueConverter

{

public object Convert(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{

if ((string)parameter == "False") return "0";

return "1*";

}

public object ConvertBack(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{

if ((int)parameter == 0) return false;

return true;

}

}

}

问题:当我使用它是这样的:

<xamlviewer:UserControl1 ShowCode="False"/> 

转换(...)被调用2次和两次“参数”呃“是”真“,否则如果ShowCode =”True“Convert()只被调用一次而”参数“又是”True“

为什么总是这样?

回答:

这里至少有两件事是错误的。

  1. 您的转换器返回一个字符串,它应该返回GridLength。

  2. 要转换的值被传递给转换器的value参数,而不是parameter,它是bool

所以,你应该这样写:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 

{

if (value is bool && (bool)value)

{

return new GridLength(1, GridUnitType.Star);

}

return new GridLength(0);

}

需要在结合无转换器参数:

outergrid.RowDefinitions[1].SetBinding(

RowDefinition.HeightProperty,

new Binding()

{

Path = new PropertyPath("ShowCode"),

Source = this,

Converter = new BoolToHeightConverter()

});

回答:

参数始终是正确的,因为你做它有一个值:

outergrid.RowDefinitions[1].SetBinding(

RowDefinition.HeightProperty,

new Binding()

{

Path = new PropertyPath("ShowCode"),

Source = this,

Converter = new BoolToHeightConverter(),

ConverterParameter = "True" // <---- You are enforcing its value here.

});

你的转换器是搞砸反正:你必须检查valueparameter正确地转换数据来回:

// NOTE: Your property is BOOL not STRING. 

public class BoolToHeightConverter : IValueConverter

{

public object Convert(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{

if(value is bool)

if((bool)value) return new GridLength(1, DataGridLengthUnitType.Star);

else return new GridLength(0);

throw new ArgumentException("Not a bool");

}

public object ConvertBack(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{

// You may not need this method at all!

if(value is GridLength)

return ((GridLength)value).Value == 0);

throw new ArgumentException("Not a GridLength");

}

}

参数不再需要(除非其他地方有其他需求)。

以上是 为什么绑定不起作用? 的全部内容, 来源链接: utcz.com/qa/258630.html

回到顶部