相关疑难解决方法(0)

WPF - MVVM - 文本框与viewmodel属性不同步

我有一个带有TextBox的WPF视图,将Text字段绑定到一个ViewSodel,并将UpdateSourceTrigger设置为PropertyChanged.在ViewModel的属性设置器中,我有一个简单的检查,以防止文本超过10个字符:

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new MainViewModel();
    }
}


public string Name
{
    get { return _Name; }
    set
    {
        if (_Name != value)
        {
            if (value.Length <= 10)
            {
                _Name = value;
            }
            RaisePropertyChanged("Name");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有设置该值,我仍然是RaisePropertyChanged(它只是触发PropertyChanged).

问题是当我在UI中输入第11个字符时,我不会更新_Name.我触发了PropertyChanged,我可以看到get访问器被调用,它返回的字符串只有10个字符.但是,我的TextBox没有反映这一点; 它仍然显示11个字符的字符串.

最重要的是,如果在第11个字符上我将setter中的文本更改为"ERROR",并且fire属性发生了更改,则TextBox会更新以显示更改的文本.

那么为什么如果我将setter中的文本更改回前一个值,那么UI不反映这个?

我知道有其他方法可以处理最大字符,但为什么这不起作用?

.net data-binding wpf mvvm viewmodel

9
推荐指数
1
解决办法
5905
查看次数

.NET 3.5 | 绑定到视图模型属性时,WPF Textbox拒绝更新自身

在我开始解释我的问题之前,请注意我的目标框架是.NET 3.5.

我有一个文本框,其文本绑定到viewmodel属性.我的要求是当用户输入一些内容(通过键盘和鼠标粘贴)进入文本框时,应该清理其中的任何垃圾字符,并使用替换的字符串更新文本框[在下面的示例中''要替换用'h'].

XAMLCode:

 <Style x:Key="longTextField" TargetType="{x:Type TextBoxBase}">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="AcceptsReturn" Value="True"/>
            <Setter Property="AllowDrop" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBoxBase}">
                        <Border      
                      Name="Border"    
                      Padding="2"    
                      Background="Transparent"    
                      BorderBrush="LightGray"    
                      BorderThickness="1">
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Foreground" Value="Black"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
 <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"  MinLines="3"       TextWrapping="Wrap"
                 SpellCheck.IsEnabled="True" Style="{StaticResource longTextField}"></TextBox>
Run Code Online (Sandbox Code Playgroud)

ViewModel属性:

     private string _value;
            public string Value
            {
                get
                {
                    return _value;
                }
                set …
Run Code Online (Sandbox Code Playgroud)

c# wpf .net-3.5

0
推荐指数
1
解决办法
5120
查看次数

标签 统计

wpf ×2

.net ×1

.net-3.5 ×1

c# ×1

data-binding ×1

mvvm ×1

viewmodel ×1