INotifyPropertyChanged для текстового поля в стиле - PullRequest
0 голосов
/ 20 февраля 2012

Я пытаюсь переименовать столбец в сетке данных WPF.Я предоставляю контекстное меню пользователю для переименования столбца.Когда пользователь нажимает на переименование из заголовка столбца определенного столбца, я применяю стиль к заголовку столбца, используя следующий код и стиль.

private void RenameColumn_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        if (e != null)
        {
            if (e.Parameter != null)
            {
                if ((e.Parameter as DataGridColumnHeader) != null)
                {
                    this.DefaultColHeaderStyle = (e.Parameter as DataGridColumnHeader).Style;
                    this.RenamedColIndex = (e.Parameter as DataGridColumnHeader).DisplayIndex;
                    (this.grTestData.ColumnFromDisplayIndex(this.RenamedColIndex)).HeaderStyle = this.grTestData.Resources["RenameColumnHeader"] as Style;
                }
            }
        }
    }

Я привязываю это текстовое поле к свойству:

<Style x:Key="RenameColumnHeader" TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid FocusManager.FocusedElement="{Binding ElementName=txtBxRename}">
                                <TextBox x:Name="txtBxRename" GotFocus="txtBxRename_GotFocus" LostFocus="txtBxRename_LostFocus" KeyDown="txtBxRename_KeyDown" TextChanged="txtBxRename_TextChanged" Text="{Binding Path=NewColName,Mode=TwoWay}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Я реализовал интерфейс INotifyPropertyChanged для свойства NewColName:

public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
 public string NewColName
    {
        get
        {
            return this.newColName;
        }
        set
        {
            this.newColName = value;
            this.OnPropertyChanged("NewColName");
        }
    }

, но этоне вызывая измененного свойства, когда я начинаю печатать в текстовом поле.Я пытаюсь реализовать IDataErrorInfo для проверки текстового поля.Пожалуйста, ведите меня.Дайте мне знать, если вам нужна какая-либо другая информация о моем коде.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Возможно, вам потребуется установить Binding.UpdateSourceTrigger на PropertyChanged, а для TextBox.Text это LostFocus по умолчанию.

0 голосов
/ 21 февраля 2012

Это было решено.

Всякий раз, когда мы связываем элемент управления, объявленный в стиле, нам нужно дать имя окну.

<Window x:Class="DataGridColumnRename.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cmd="clr-namespace:DataGridColumnRename"
    Title="MainWindow" Height="350" Width="525" Name="Me">

И в элементе управления в стиле нам нужно указать свойство ElementName и присвоить ему имя ветра (в данном случае это «Me»).

            <Style x:Key="RenameColumnHeader" TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid FocusManager.FocusedElement="{Binding ElementName=txtBxRename}">
                                <TextBox x:Name="txtBxRename" GotFocus="txtBxRename_GotFocus" LostFocus="txtBxRename_LostFocus" KeyDown="txtBxRename_KeyDown" Text="{Binding ElementName=Me, Path=NewColName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

Тогда только это вызывает INotifyPropertyChanged. :) :) Спасибо за помощь, ребята.

...