WPF Databinding не звонит! - PullRequest
       10

WPF Databinding не звонит!

1 голос
/ 03 января 2009

У меня есть UserControl, который содержит TextBox и элемент управления Button. Кнопка открывает FileDialog, и пользователь выбирает файл. Выбранный файл передается в свойство FileName, которое является свойством зависимости. По какой-то причине TextBox не привязан к этому свойству. Вот код:

<UserControl x:Class="WPF3D.FileInputBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300" x:Name="root">
    <Grid>

        <StackPanel>            
        <TextBox Name="txtFile" Text="{Binding FileName, ElementName=root}" Width="300" Height="20" />
        <Button Content="Select File" Width="100" Height="20" Click="SelectFile"  /> 
        </StackPanel>



    </Grid>
</UserControl>

А вот код для файла UserControl.cs:

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 Microsoft.Win32;
using System.Windows.Markup;

namespace WPF3D
{
    [ContentProperty("FileName")]
    public partial class FileInputBox : UserControl
    {
        public static readonly DependencyProperty FileNameProperty = DependencyProperty.Register("FileName",
                                                                                                 typeof (String),
                                                                                                 typeof (FileInputBox));


        public event EventHandler<EventArgs> FileNameChanged; 

        public FileInputBox()
        {
            InitializeComponent();
            txtFile.TextChanged += new TextChangedEventHandler(txtFile_TextChanged);
        }

        void txtFile_TextChanged(object sender, TextChangedEventArgs e)
        {
            e.Handled = true; 
            if(FileNameChanged != null)
            {
                FileNameChanged(this, EventArgs.Empty); 
            }

        }

        public string FileName
        {
            get { return (string) GetValue(FileNameProperty); }
            set { SetValue(FileNameProperty,value);}
        }


        private void SelectFile(object sender, RoutedEventArgs e)
        {
            // select the file 
            var fileDialog = new OpenFileDialog();
            fileDialog.ShowDialog();

            this.FileName = fileDialog.FileName;
        }

        protected override void OnContentChanged(object oldContent, object newContent)
        {
            if(oldContent != null)
                throw new InvalidOperationException("You can't change the content"); 
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 04 января 2009

Я думаю, что это просто проблема с областью видимости, о чем свидетельствует этот вывод в окне отладки:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=root'. BindingExpression:Path=FileName; DataItem=null; target element is 'TextBox' (Name='txtFile'); target property is 'Text' (type 'String')

Если вы просто измените его на это, оно будет работать нормально:

<UserControl x:Class="TestApp.FileInputBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid x:Name="_grid">
        <StackPanel>
            <TextBox Name="txtFile" Text="{Binding FileName}" Width="300" Height="20" />
            <Button Content="Select File" Width="100" Height="20" Click="SelectFile"  />
        </StackPanel>
    </Grid>
</UserControl>

И важная часть кода позади:

public FileInputBox()
{
    InitializeComponent();
    txtFile.TextChanged += new TextChangedEventHandler(txtFile_TextChanged);
    _grid.DataContext = this;
}

Обратите внимание, что установка DataContext на Grid вместо UserControl является преднамеренной. Если вы сделаете это на уровне UserControl, потребители вашего контроля смогут разорвать ваши привязки, просто изменив DataContext вашего UserControl.

0 голосов
/ 03 января 2009

Получил ответ по следующей ссылке:

http://geekswithblogs.net/thibbard/archive/2008/04/22/wpf-custom-control-dependency-property-gotcha.aspx

Кажется, это слабое ограничение инфраструктуры WPF!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...