我正在使用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
的属性,绑定确实有效。
答案 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。它帮助了我。