这应该是一个非常简单的例子,但我拉着头发试图让它工作。这里是设置:WPF用户控件绑定问题
我正在设计一个应用程序,将有一些只读模式和编辑模式的数据。所以我创建了一个用户控件,这是一个文本框和文本块绑定到相同的文本数据,并基于EditableMode属性有条件地可见(所以当它是可编辑的文本框显示,当它不是文本块显示)
现在,我想在我的主窗口中拥有许多这些控件,并让它们都绑定一个单一的布尔属性。当通过按钮更改该属性时,我希望所有TextBlocks都变成TextBoxes或返回。
我的问题是,控制设置正确的绑定,如果我做myUserControl.Editable = true。但是,如果将其绑定到bool属性,它不会改变。
这里是我的用户控件的代码:
<UserControl x:Class="CustomerCareTool.Controls.EditableLabelControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:CustomerCareTool.Converters"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<UserControl.Resources>
<src:BoolToVisibility x:Key="boolToVisibility" Inverted="False" />
<src:BoolToVisibility x:Key="invertedBoolToVisibility" Inverted="True" />
</UserControl.Resources>
<Grid>
<TextBlock Name="textBlock" Text="{Binding Path=TextBoxValue}" Visibility="{Binding Path=EditableMode, Converter={StaticResource invertedBoolToVisibility}}"/>
<TextBox Name="textBox" Visibility="{Binding Path=EditableMode, Converter={StaticResource boolToVisibility}}">
<TextBox.Text>
<Binding Path="TextBoxValue" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
</Grid>
我用了一个转换器转换成布尔能见度和逆布尔能见度。不知道这是否完全需要。
这是后面的代码:
public partial class EditableLabelControl : UserControl
{
public EditableLabelControl()
{
InitializeComponent();
}
public string TextBoxValue
{
get { return (string)GetValue(TextBoxValueProperty); }
set { SetValue(TextBoxValueProperty, value); }
}
public static readonly DependencyProperty TextBoxValueProperty =
DependencyProperty.Register("TextBoxValue", typeof(string), typeof(EditableLabelControl), new UIPropertyMetadata());
public bool EditableMode
{
get { return (bool)GetValue(EditableModeProperty); }
set { SetValue(EditableModeProperty, value); }
}
public static readonly DependencyProperty EditableModeProperty =
DependencyProperty.Register("EditableMode", typeof(bool),typeof(EditableLabelControl), new UIPropertyMetadata(false, EditableModePropertyCallBack));
static void EditableModePropertyCallBack(DependencyObject property,
DependencyPropertyChangedEventArgs args)
{
var editableLabelControl = (EditableLabelControl)property;
var editMode = (bool)args.NewValue;
if (editMode)
{
editableLabelControl.textBox.Visibility = Visibility.Visible;
editableLabelControl.textBlock.Visibility = Visibility.Collapsed;
}
else
{
editableLabelControl.textBox.Visibility = Visibility.Collapsed;
editableLabelControl.textBlock.Visibility = Visibility.Visible;
}
}
}
现在我的主要应用程序,我已经添加这样的控制:
<Controls:EditableLabelControl x:Name="testCtrl" EditableMode="{Binding Path=Editable}" TextBoxValue="John Smith" Grid.Row="0"/>
对于同一应用程序的DataContext设置自
DataContext="{Binding RelativeSource={RelativeSource Self}}"
而后面的代码看起来像这样:
public partial class OrderInfoView : Window, INotifyPropertyChanged
{
public OrderInfoView()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Editable = !Editable;
}
private bool _editable = false;
public bool Editable
{
get
{
return _editable;
}
set
{
_editable = value;
OnPropertyChanged("Editable");
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged == null) return;
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
点击该按钮并没有做任何事情:(我试过一切都得到这个工作,并没有骰子。真的很感谢一些帮助!
我尝试了以下内容,仍然不能正常工作:
public bool Editable
{
get { return (bool)GetValue(EditableProperty); }
set { SetValue(EditableProperty, value); }
}
public static readonly DependencyProperty EditableProperty =
DependencyProperty.Register("Editable", typeof(bool), typeof(OrderInfoView), new UIPropertyMetadata(false));
我建议把问题解决。你确定你的可编辑绑定正在工作吗?为了测试这个,你可以将你的{Binding Path = Editable}绑定复制到一个普通的TextBlock中,并查看点击按钮时的true和false开关。 如果该绑定起作用,然后在EditableModePropertyCallBack方法中抛出一个断点并确保获得命中。如果中断点被击中,然后逐步完成并确保它按预期执行。 让我知道你会得到什么结果。 –
我会给它一个镜头并发布更新。非常感谢您的帮助! –