[英]Databinding not working with usercontrol
我正在嘗試對treenodes進行就地編輯。 我很近但是沒有雪茄。 所有綁定似乎都是正確的。 應用程序運行正常,沒有輸出消息,樹視圖被填充。 我可以選擇一個節點,按F2鍵,就可以編輯該節點,但是一旦按下Enter鍵,文本就會恢復為之前的樣子,好像我沒有進行編輯一樣。 如果我在應用程序的其他地方對Name屬性進行編輯,則該更改會反映在EditableTextBlock中,無論是在TextBlock中還是在TextBox中。 為什么我不能使更改持久化? 好像綁定僅以一種方式起作用。
這是用戶控件的xaml:
<UserControl x:Class="WPFApplication.EditableTextBlock"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFApplication"
x:Name="MyUserControl">
<UserControl.Resources>
<DataTemplate x:Key="EditModeTemplate">
<TextBox KeyDown="TextBox_KeyDown" Loaded="TextBox_Loaded" LostFocus="TextBox_LostFocus"
Text="{Binding Path=Text, ElementName=MyUserControl, Mode=TwoWay}"
Margin="0" BorderThickness="1" />
</DataTemplate>
<DataTemplate x:Key="DisplayModeTemplate">
<TextBlock Text="{Binding ElementName=MyUserControl, Path=Text, Mode=TwoWay}"/>
</DataTemplate>
<Style TargetType="{x:Type local:EditableTextBlock}">
<Style.Triggers>
<Trigger Property="IsInEditMode" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource EditModeTemplate}" />
</Trigger>
<Trigger Property="IsInEditMode" Value="False">
<Setter Property="ContentTemplate" Value="{StaticResource DisplayModeTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
以及后面的代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WPFApplication
{
public partial class EditableTextBlock : UserControl
{
#region Constructor
public EditableTextBlock()
{
InitializeComponent();
base.Focusable = true;
base.FocusVisualStyle = null;
}
#endregion Constructor
#region Member Variables
// We keep the old text when we go into editmode
// in case the user aborts with the escape key
private string oldText;
#endregion Member Variables
#region Properties
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register(
"Text",
typeof(string),
typeof(EditableTextBlock),
new PropertyMetadata(""));
public bool IsEditable
{
get { return (bool)GetValue(IsEditableProperty); }
set { SetValue(IsEditableProperty, value); }
}
public static readonly DependencyProperty IsEditableProperty =
DependencyProperty.Register(
"IsEditable",
typeof(bool),
typeof(EditableTextBlock),
new PropertyMetadata(true));
public bool IsInEditMode
{
get
{
if (IsEditable)
return (bool)GetValue(IsInEditModeProperty);
else
return false;
}
set
{
if (IsEditable)
{
if (value) oldText = Text;
SetValue(IsInEditModeProperty, value);
}
}
}
public static readonly DependencyProperty IsInEditModeProperty =
DependencyProperty.Register(
"IsInEditMode",
typeof(bool),
typeof(EditableTextBlock),
new PropertyMetadata(false));
public string TextFormat
{
get { return (string)GetValue(TextFormatProperty); }
set
{
if (value == "") value = "{0}";
SetValue(TextFormatProperty, value);
}
}
public static readonly DependencyProperty TextFormatProperty =
DependencyProperty.Register(
"TextFormat",
typeof(string),
typeof(EditableTextBlock),
new PropertyMetadata("{0}"));
public string FormattedText
{
get { return String.Format(TextFormat, Text); }
}
#endregion Properties
#region Event Handlers
// Invoked when we enter edit mode.
void TextBox_Loaded(object sender, RoutedEventArgs e)
{
TextBox txt = sender as TextBox;
// Give the TextBox input focus
txt.Focus();
txt.SelectAll();
}
// Invoked when we exit edit mode.
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
this.IsInEditMode = false;
}
// Invoked when the user edits the annotation.
void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.IsInEditMode = false;
e.Handled = true;
}
else if (e.Key == Key.Escape)
{
this.IsInEditMode = false;
Text = oldText;
e.Handled = true;
}
}
#endregion Event Handlers
}
}
然后,treeview使用此數據模板:
<HierarchicalDataTemplate DataType="{x:Type localvm:TreeViewItemViewModel}" ItemsSource="{Binding Children}">
<StackPanel>
<local:EditableTextBlock Text="{Binding Name}"/>
</StackPanel>
好的,我盡力了,問題是從未設置Text屬性,因為您的TextBox從未失去焦點(看來)。
因此,我更改了TextBox的Text綁定,以添加UpdateSourceTrigger = PropertyChanged和一個RelativeSource而不是ElementName:
Text="{Binding Path=Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
而且有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.