WPF:绑定到类属性

时间:2015-04-28 15:12:38

标签: c# wpf mvvm

我正在使用MVVM,我正在尝试将三个TextBox绑定到Client类属性,如下所示:

<TextBox Text="{Binding NewClient.Name, Mode=OneWayToSource}" Grid.Column="1" HorizontalAlignment="Left" Margin="5"/>
<TextBox Text="{Binding NewClient.NameInLatin, Mode=OneWayToSource}" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Margin="5"/>
<StackPanel Orientation="Horizontal" Grid.Row="2" Grid.Column="1" >
    <TextBox Text="{Binding NewClient.IDNumber, Mode=OneWayToSource}" Margin="5" />
    <Button Content="{Binding ScanLabel,Source={StaticResource LocalStrings}}"  Margin="4"/>
</StackPanel>

在我的视图模型中,我以经典方式定义了NewClient属性:

private Client newClient;
public Client NewClient
{
     get { return newClient; }
     set
     {
         newClient = value;
         NotifyPropertyChanged("NewClient");
     }
}

在boolean属性中放置断点只是为了测试newClient的值,我发现它为null。

那么为什么newClient属性会失去它的价值?

以下是整个xaml部分:

<Border Background="AntiqueWhite"
        DataContext="{StaticResource ServicesViewModel}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="120" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding NameLabel, Source={StaticResource LocalStrings}}"
                    Style="{StaticResource SubTitles}" />
        <TextBlock Text="{Binding NameInLatinLabel, Source={StaticResource LocalStrings}}"
                    Grid.Row="1"
                    Style="{StaticResource SubTitles}" />
        <TextBlock Text="{Binding IDNumberLabel, Source={StaticResource LocalStrings}}"
                    Grid.Row="2"
                    Style="{StaticResource SubTitles}" />
        <TextBox Text="{Binding NewClient.Name, Mode=OneWayToSource}"
                    Grid.Column="1"
                    HorizontalAlignment="Left" />
            <TextBox Text="{Binding NewClient.NameInLatin, Mode=OneWayToSource}"
                     Grid.Row="1"
                     Grid.Column="1"
                     HorizontalAlignment="Left" />
            <StackPanel Orientation="Horizontal"
                    Grid.Row="2"
                    Grid.Column="1">
            <TextBox Text="{Binding NewClient.IDNumber, Mode=OneWayToSource}" />
            <Button Content="{Binding ScanLabel,Source={StaticResource LocalStrings}}" />
        </StackPanel>
    </Grid>
</Border>

我厌倦了绑定到我创建的名为Name的属性,绑定确实有效。

3 个答案:

答案 0 :(得分:0)

默认情况下TextBox.Text会在控件失去焦点时更新,因此如果您需要在每次文本更改时更新属性,则应使用如下绑定:

{Binding NewClient.Name, UpdateSourceTrigger=PropertyChanged}

How to: Control When the TextBox Text Updates the Source

如果它仍然不起作用,那么NewClient可能不会被初始化。在Debug Output窗口中,应该显示绑定问题。

答案 1 :(得分:0)

您不需要使用datacontext中保存的项目的名称。只需报告其财产:

在:

Binding NewClient.Name, Mode=OneWayToSource

Binding Name, Mode=OneWayToSource

此外,OneWayToSource主要用于只读数据。删除它

 Binding Name

答案 2 :(得分:0)

我遇到了类似的问题。在ViewModel中,我确实绑定了一个Class属性。

class SampleClass
{
    public string Name {get; set;}
    public int Age {get; set;}
}

class ViewModelClass
{
    public SampleClass Sample {get; set;}
}

我发现绑定工作,应该使用SampleClass中的Properties,而不是Fields。它帮助了我。