【问题标题】:How do I access a text bound to a dependency property in the view model?如何访问绑定到视图模型中依赖属性的文本?
【发布时间】:2016-01-22 23:07:27
【问题描述】:

我想访问绑定到视图模型中的文本框的依赖属性。 在视图模型中,我有以下代码:

Answer _Answer = new Answer();
_Answer.GetValue(Answer.Deutsch1AnswerProperty);
Console.WriteLine(_Answer.Deutsch1Answer);

依赖属性定义如下:

public class Answer : DependencyObject
{
    // Ereignis
    public event EventHandler Deutsch1AnswerChanged;

    public static readonly DependencyProperty Deutsch1AnswerProperty;

    public String Deutsch1Answer
    {
        get { return (String)GetValue(Deutsch1AnswerProperty); }
        set { SetValue(Deutsch1AnswerProperty, value); }
    }

    public static void OnDeutsch1AnswerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        Answer _Answer = (Answer)sender;
        if (_Answer.Deutsch1AnswerChanged != null)
            _Answer.Deutsch1AnswerChanged(_Answer, null);
    }

    static Answer()
    {
        FrameworkPropertyMetadata meta = new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault);
        meta.PropertyChangedCallback = new PropertyChangedCallback(OnDeutsch1AnswerChanged);

        Deutsch1AnswerProperty = DependencyProperty.Register("Deutsch1Answer", typeof(String), typeof(Answer), meta);
    }
}

在 MainWindow.Xaml 我有以下代码:

<Window.Resources>
    <local:Answer x:Key="_Answer" Deutsch1Answer=string.Empty />
</Window.Resources>
<Grid Definitions ...>
   <TextBox Grid.Column="1" Grid.Row="2" Name="BoxDeutsch1" Text="{Binding Source={StaticResource _Answer}, Path=Deutsch1Answer}">
    </TextBox>

我无法访问视图模型中的文本属性。请帮忙。

视图模型如下所示:

public class VokabelViewModel : INotifyPropertyChanged
{
    private Vokabel _Model;
    public VokabelViewModel(Vokabel model)
    {
        _Model = model;
    }

    private ICommand _boxDeutsch1_HitEnter;
    public ICommand BoxDeutsch1_HitEnter
    {
        get
        {
            return _boxDeutsch1_HitEnter ?? (_boxDeutsch1_HitEnter = new CommandHandler(() => MyActionBoxDeutsch1_HitEnter(), _canExecuteBoxDeutsch1_HitEnter));
        }
    }
    private bool _canExecuteBoxDeutsch1_HitEnter;
    public void MyActionBoxDeutsch1_HitEnter()
    {
        Answer _Answer = new Answer();
        _Answer.GetValue(Answer.Deutsch1AnswerProperty);
        _Model.TestVokabel(_Answer.Deutsch1Answer);
    }

【问题讨论】:

  • 您在 XAML 中有一个带有空 Deutsch1Answer 的资源,这就是绑定到您的 TextBox 的内容。我看不到您在哪里将 DataContext 设置为您在最顶部所做的“new Answer()”。您可能只想要其中一个。
  • 我的 DataContext 设置为我的 ViewModel。如何将 DataContext 设置为 new Answer()? this.DataContext = _VokabelViewModel;
  • 如果您想在 XAML 中设置 DataContext,请在此处查看前 2 个答案:stackoverflow.com/questions/4590446/…。我个人更喜欢在代码中设置它,但是:stackoverflow.com/questions/5824600/…
  • 谢谢 - 但我仍然没有解决我的问题的方法。我已将代码中的 DataContext 设置为我的视图模型。类答案与我的视图模型是分开的,因为它需要是一个依赖对象。我还在上面发布了我的视图模型的一部分。
  • 试试这个。 1. 在 XAML 中的&lt;Window&gt;定义一个 xmlns。例如&lt;Window ... xmlns:ViewModels="clr-namespace:NAMESPACE.TO.ANSWER.VIEWMODEL" ...&gt; 2. 替换 &lt;Window.Resources&gt;&lt;Window.DataContext&gt;&lt;ViewModels:Answer /&gt;&lt;/Window.DataContext&gt;

标签: c# wpf data-binding


【解决方案1】:

如果您想访问 ViewModel 中的 Deutsch1Answer DependencyProperty,您应该绑定到它。 但是我真的不明白为什么你有“答案”类。

如果您想将文本框文本绑定到视图模型中的属性,您应该添加一个 Answer 属性并将其直接绑定到文本框。

在您的视图模型中:

private string m_answer;

public string Answer
{
  get { return m_answer; }
  set 
    { 
      m_answer = value;
      OnPropertyChanged("Answer");
    }
}

在你看来:

...
<TextBox Grid.Column="1" Grid.Row="2" Name="BoxDeutsch1" Text="{Binding Answer}">
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多