为什么绑定不起作用?
所以我创建了一个带有“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“
为什么总是这样?
回答:
这里至少有两件事是错误的。
您的转换器返回一个字符串,它应该返回GridLength。
要转换的值被传递给转换器的
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.
});
你的转换器是搞砸反正:你必须检查value
不parameter
正确地转换数据来回:
// 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