Проблема привязки данных к текстовому полю и методам доступа - PullRequest
1 голос
/ 19 апреля 2011

Мне интересно, что мне не хватает?Привязка вообще не отображается в текстовом поле.Это мои коды:

Пространство имен XAML:

xmlns:c="clr-namespace:mySystem.Workspace"

DataContext и ресурсы:

<Grid.Resources>
        <c:Parameter x:Key="mySource"/>
    </Grid.Resources>
    <Canvas>
        <Canvas.DataContext>
            <Binding Source="{StaticResource mySource}" />
        </Canvas.DataContext>

Текстовое поле:

<TextBox x:Name="TextBox" Width="159" Height="26" Canvas.Left="36" Canvas.Top="47">
            <TextBox.Text>
                <Binding Path="JobKey" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
            </TextBox.Text>

Класс:

namespace mySystem.Workspace
{
  public class Parameter : Object  
  { 

Аксессоры:

 public BasePar JobKey
 {
   get { return jobKey; }
   set { jobKey = value; }
 }

Ответы [ 4 ]

4 голосов
/ 19 апреля 2011

Здесь много странных вещей, но наиболее очевидная вещь, которая заставит вас работать, заключается в том, что путь привязки чувствителен к регистру.

Измените привязку на:

<Binding Path="JobKey" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>

Этодолжно заставить работать связывание.

Я также не уверен, какой тип BasePar, или должен быть, но если вы не делаете что-то умное намеренно, просто сделайте его стандартным типом, таким как string.

Возможно, вам также следует использовать не пространство имен System.Workspace, а что-то, связанное с вашим собственным проектом.


После вашего ответа я могу только догадываться, для чего предназначен объект BasePar,должен использоваться в DataTemplate, например, в элементе ItemsControl.DataTemplates имеют такое поведение, что, когда они не знают, как отобразить объект, они прибегнут к методу .ToString () объекта.

Теперь, в своем комментарии я сказал, что не думаю, что TextBox может иметь DataTemplate, и я верю, что это правда однако Я нашел трюк в этот вопрос Stackoverflow , в котором вместо шаблонов используется элемент управления контентом и текстовый блок.Код ниже:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:System.Workspace"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <c:Parameter x:Key="mySource"/>

        <DataTemplate x:Key="MyDataTemplate">
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </Grid.Resources>

    <Canvas>
        <Canvas.DataContext>
            <Binding Source="{StaticResource mySource}" />
        </Canvas.DataContext>

        <ContentControl            
           Content="{Binding Path=JobKey}"             
           ContentTemplate="{StaticResource MyDataTemplate}" />
    </Canvas>

</Grid>

У меня сейчас нет времени, чтобы заставить работать TextBox - даже не знаю, возможно ли это, учитывая мои первые несколько попыток.Тем не менее, это может помочь вам добраться туда, куда вам нужно.

Но все же - если бы я был мной, я бы просто использовал простую привязку к стандартным объектам.Я не вижу преимущества класса BasePar в этом сценарии.

3 голосов
/ 27 апреля 2011

Как выглядит реализация BasePar? Загляните в окно Debug Output, чтобы увидеть, есть ли у вас такая строка:

System.Windows.Data Error: 1 : Cannot create default converter to perform 'two-way' conversions between types 'WpfApplication1.BasePar' and 'System.String'. Consider using Converter property of Binding. BindingExpression:Path=JobKey; DataItem='Parameter' (HashCode=14209755); target element is 'TextBox' (Name='TextBox'); target property is 'Text' (type 'String')

Это говорит о том, что вы пытаетесь привязать свойство, но WPF не может создать двухстороннюю привязку, потому что не может преобразовать текст (вы вводите его в TextBox) в объект BasePar.

Согласно предложению Дэвида, вы можете привязаться к примитивному типу строки или, альтернативно (согласно предупреждению выше), вы можете добавить Converter к привязке, чтобы преобразовать строку в BasePar.

1 голос
/ 19 апреля 2011

Path = "jobKey"

Вам необходимо привязать к свойству, а не к полю, то есть сделать это прописными буквами. Также: для отладки привязок проверьте окно вывода в Visiual Studio.

1 голос
/ 19 апреля 2011

вам нужно сделать jobkey DependencyProperty, извлекая его из DependencyObject или получить ваш класс из INotifyPropertyChanged и добавить весь код уведомления и т. Д.

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

...