在ICommand-tied函数中编写时,属性不会更新前端

时间:2015-04-21 23:02:36

标签: wpf mvvm viewmodel inotifypropertychanged icommand

更新3

“我希望此TextBox中的文本应显示在另一个TextBox中(在另一个视图中)”

另一个视图中的第二个文本框用于显示与第一个文本框相关联的其他信息,但不包含副本。

因此,用户控件包含一个文本框,例如,总线代码。一旦我输入总线代码,Tabbing out将触发从数据库中获取其他详细信息,例如总线名称,总线目的地,总线模型等。 然后在另一个视图中的其他文本框显示总线名称。以下所有文本框都显示目标等。当调用该命令时,我尝试写入属性BusName,它被分配(并且我调用Notify(“BusName”))但它没有在UI上显示。

希望更清楚。对不起造成的任何混淆:)。

UPDATE2 - 对盲人的回应

感谢您的回复,虽然这似乎不是我想要的。选项卡是必不可少的,因为这就是管理层希望填充页面的方式,即当您在输入代码后从“代码”文本框中选中时,它将使用代码从数据库中获取数据以填充其余控件。这似乎没有标签输出行为。至于第三个依赖属性,它在我的原始代码中,我只是没有在这里包含它,因为第一个文本框(用户控件tabout文本框)中的值与问题无关。简单地说,我想要完成的是第二个文本框必须填充第一个文本框的选项卡。

我可以使用eventhandler执行此操作,但希望使用命令。我现在想也许命令不是这里的方式,我应该切换到使用事件处理程序。

请告知您是否仍然有任何关于如何在第一个选项卡填充时填充第二个文本框的想法(通过在填充中添加断点,您将看到该属性已分配。)。如果我没有正确理解或错过了什么,请告诉我。谢谢!

UPDATE! 我创建了一个模仿我的代码的VS2013解决方案,它可以重现问题。它在这个公共谷歌驱动器链接作为一个zip文件(下载图标出现需要几秒钟):

https://drive.google.com/file/d/0B89vOvsI7Ubdbk85SVlvT3U2dVU/view?usp=sharing

尽管绑定属性存储了新值,但您将看到第二个文本框不会更新。

非常感谢任何帮助。提前谢谢。


原帖:

我有一个文本框控件,我绑定了一个基于键绑定的命令,当用户在文本框中弹出选项卡时(标签输出)处理一些操作(在命令绑定的方法中)。 / p>

我在该页面中有其他控件,这些控件是我在该tab-out连接函数中写入的viewmodel中的属性的boiund。当我在构造函数中或在命令invokation的“outside”某处编写我的属性时,它们似乎工作正常并且值显示在页面上,但是当我在该命令调用中编写它们时,vm中的属性包含值但不是'显示在UI上

任何想法为什么以及如何解决?

非常感谢提前

来自XAML:

        <TextBox Name="txtCode" Text="{Binding Path=CodeValue, Mode=TwoWay,      UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Key="Tab"  Command="{Binding RetrieveRecordCmd}" >  </KeyBinding>
        </TextBox.InputBindings>
    </TextBox>

来自VM:

       RetrieveRecordCmd = new GSSCommand(RetrieveRecord, param => this.CanExecuteRetrieveRecordCmd);

命令绑定功能:

        public void RetrieveRecord(object obj)
    {
        objPie = null;

        //Check if a record exists for that code
        gssSvcMethodStatusBase = gssSvcClientBase.ReadPies(ref gssSvcGlobalVarsBase, out objPie, out grfaBase, CodeValue);

        if ((objPie != null))  // && (objPie.DateCreated > DateTime.MinValue))
            PopulatePage(objPie);
        else if (objPie == null)            
            InitiateCreateNew();            
        else            
            return;            
    }

1 个答案:

答案 0 :(得分:0)

这有效,但我不知道这是否是你想要的行为。

<UserControl x:Class="ProblemDemoWPF.TextBoxTabOutUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Name="TabOutTextUserControl"
         >
<StackPanel Margin="0,0,0,0" Orientation="Horizontal">
    <Label Content="UserControl (ucTextBox)->"></Label>
    <TextBox Width="80" Height="30" BorderBrush="Black"
                            BorderThickness="2"                             
                        HorizontalAlignment="Center"
                         VerticalAlignment="Center"
                         Text="{Binding ElementName=TabOutTextUserControl, Path=CodeValue}">
    </TextBox>
</StackPanel>
</UserControl>

具有没有DataContext的正确绑定的新依赖属性

public partial class TextBoxTabOutUserControl : UserControl
{
    public static readonly DependencyProperty CodeValueProperty = 
        DependencyProperty.Register("CodeValue", typeof(string), typeof(TextBoxTabOutUserControl));

    public string CodeValue
    {
        get { return (string)GetValue(CodeValueProperty); }
        set { SetValue(CodeValueProperty, value); }
    }


    public TextBoxTabOutUserControl()
    {
        InitializeComponent();
    }
}

将两者绑定到LocTextBoxText

<Window x:Class="ProblemDemoWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:ProblemDemoWPF"
     Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <loc:TextBoxTabOutUserControl Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="left" 
                                  CodeValue="{Binding Buscode, Mode=OneWayToSource}"/>

    <Label Content="Busname" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left"></Label>
    <TextBox Width="100" Grid.Row="1" Grid.Column="1" Text="{Binding Path=Busname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>

    <Label Content="Busdestination" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left"></Label>
    <TextBox Width="100" Grid.Row="2" Grid.Column="1" Text="{Binding Path=Busdestination, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>

    <Label Content="Busmodel" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Left"></Label>
    <TextBox Width="100" Grid.Row="3" Grid.Column="1" Text="{Binding Path=Busmodel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</Grid>
</Window>

将Notify添加到属性设置器

class MainWindowViewModel : INotifyPropertyChanged
{
    private String _buscode;
    private string _busname;
    private string _busdestination;
    private string _busmodel;

    public String Buscode
    {
        get
        {
            return _buscode;
        }
        set
        {
            if (_buscode != value)
            {
                _buscode = value;
                Notify("Buscode");
                FetchData(_buscode);
            }
        }
    }

    private void FetchData(string buscode)
    {
        //DB stuff
        this.Busname = "Name 1234";
        this.Busmodel = "Model 1234";
        this.Busdestination = "Destination 1234";

    }

    public string Busname
    {
        get { return _busname; }
        set { _busname = value; Notify("Busname"); }
    }

    public string Busdestination
    {
        get { return _busdestination; }
        set { _busdestination = value; Notify("Busdestination"); }
    }

    public string Busmodel
    {
        get { return _busmodel; }
        set { _busmodel = value; Notify("Busmodel"); }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void Notify(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}