从第二个lib项目绑定用户控件不起作用 - wpf mvvm

时间:2018-01-07 23:27:02

标签: c# wpf xaml mvvm

我的任务:我想绑定文本框和按钮。

虽然我发现了很多关于它的主题,但我无法解决我的问题。 我有项目:WPF应用程序 WITH DEFAULT XAML no BINDING 的客户端,它从MenuWindow项目获取上下文,这是库。在MenuWindow项目中,我有一个名为UserProgram的用户控件WPF。

<UserControl x:Class="MenuWindow.MenuProgram"
         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" 
         xmlns:local="clr-namespace:MenuWindow"
         mc:Ignorable="d" 
         d:DesignHeight="550" d:DesignWidth="780">
<UserControl.DataContext>
    <local:MenuViewModel/>
</UserControl.DataContext>
<Grid Background="#FF6F6FA4">
    <Label x:Name="lblTitle" Content="GUI Export Revit Data" HorizontalAlignment="Left" Margin="277,31,0,0" VerticalAlignment="Top" Height="50" Width="258" FontSize="24" FontWeight="Bold"/>
    <Label x:Name="lblPrtdPath" Content="File prtd path" HorizontalAlignment="Left" Margin="200,176,0,0" VerticalAlignment="Top"/>
    <Label x:Name="lblXmlPath1" Content="File xml path1" HorizontalAlignment="Left" Margin="200,222,0,0" VerticalAlignment="Top"/>
    <Label x:Name="lblXmlPath2" Content="File xml path2" HorizontalAlignment="Left" Margin="200,266,0,0" VerticalAlignment="Top"/>
    <TextBox x:Name="tbxPrtd" HorizontalAlignment="Left" Height="23" Margin="302,176,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="268" Text="{Binding PrtdFilePath}"/>
    <TextBox x:Name="tbxXml1" HorizontalAlignment="Left" Height="23" Margin="302,222,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="268" Text="{Binding XmlFilePath1}"/>
    <TextBox x:Name="tbxXml2" HorizontalAlignment="Left" Height="23" Margin="302,266,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="268" Text="{Binding XmlFilePath2}"/>
    <Button x:Name="SayHi" Content="Start" HorizontalAlignment="Left" Margin="302,450,0,0" VerticalAlignment="Top" Width="174" Height="84" FontSize="22" Command="{Binding SayHi}" />
    <Button x:Name="btnAbout" Content="About" HorizontalAlignment="Left" Margin="705,496,0,0" VerticalAlignment="Top" Width="55" Height="38" Command="{Binding SayHi}"/>
</Grid>

所以我有

<UserControl.DataContext>
<mv:MenuViewModel/>
</UserControl.DataContext>

并使用textBoxs或按钮我想使用绑定。

在此用户控件的codeBehind中,除了默认初始化之外什么都没有。 在项目菜单中有: 带有映射的MenuArguments.cs:

public string PrtdFilePath { get; set; }
public string XmlFilePath1 { get; set; }
public string XmlFilePath2 { get; set; }

RelayCommand:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace MenuWindow
{
public class RelayCommand : ICommand
{
    private readonly Func<Boolean> _canExecute;
    private readonly Action _execute;

    public RelayCommand(Action execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action execute, Func<Boolean> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested += value;
        }
        remove
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested -= value;
        }
    }

    public Boolean CanExecute(Object parameter)
    {
        return _canExecute == null ? true : _canExecute();
    }

    public void Execute(Object parameter)
    {
        _execute();
    }
}
}

和MenuViewModel.cs

namespace MenuWindow
{
public class MenuViewModel : INotifyPropertyChanged
{
    public string gowno;
    public MenuArguments _menuArgumenty;
    public string PrtdFilePath
    {
        get { return _menuArgumenty.PrtdFilePath; }
        set
        {
            _menuArgumenty.PrtdFilePath = value;
            OnPropertyChanged("PrtdFilePath");
        }
    }
    public string XmlFilePath1
    {
        get { return _menuArgumenty.XmlFilePath1; }
        set
        {
            _menuArgumenty.XmlFilePath1 = value;
            OnPropertyChanged("XmlFilePath1");
        }
    }
    public string XmlFilePath2
    {
        get { return _menuArgumenty.XmlFilePath2; }
        set
        {
            _menuArgumenty.XmlFilePath2 = value;
            OnPropertyChanged("XmlFilePath2");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public MenuViewModel()
    {
        _menuArgumenty = new MenuArguments();
    }
    public ICommand SayHi
    {
        get
        {
            return new RelayCommand(SayHiExcute, CanSayHiExcute);
        }
    }

    private void SayHiExcute()
    {
        if (!MenuArgumentsExists(_menuArgumenty))
        {
            MessageBox.Show(string.Format("Hi {0} {1}!", _menuArgumenty.PrtdFilePath, _menuArgumenty.XmlFilePath1));
            SavePerosn(_menuArgumenty);
        }
        else
        {
            MessageBox.Show(string.Format("Hey {0} {1}, you exists in our database!", _menuArgumenty.PrtdFilePath, _menuArgumenty.XmlFilePath1));
        }
    }

    private void SavePerosn(MenuArguments _menuArgumenty)
    {
        //Some Database Logic
    }

    private bool CanSayHiExcute()
    {
        return !MenuArgumentsExists(_menuArgumenty);
    }

    private bool MenuArgumentsExists(MenuArguments _menuArgumenty)
    {
        //Some logic
        return false;
    }

}
}

当我启动程序时,debuger会通过绑定属性。窗口出现后,没有绑定反应。我做错了什么?请帮帮我。

BR, 学生塞纳留斯

感谢您的评论,对您的评论的回答:

@tabby - 我想绑定textBoxes:PrtdFilePath,XmlFilePath1,XmlFilePath1和按钮SayHi

@maulik kansara - 你是对的,我正在尝试其他一些方法而且我没有删除代码。它应该只是本地版本。

@ grek40 - 我的示例适用于Window for not for UserControl的解决方案中的一个项目,该项目在另一个项目中设置。这是图片: enter image description here

@ mm8 - 我希望将数据放入textBoxes或点击按钮以查看断点:

        public string PrtdFilePath
    {
        get { return _menuArgumenty.PrtdFilePath; }
        set
        {
            _menuArgumenty.PrtdFilePath = value;
            OnPropertyChanged("PrtdFilePath");
        }
    }

最后,我认为XAML中的代码存在问题。我正在阅读关于寻找绑定/视图模型/路径的父子关系,但我很困惑,我不知道如何解决它。请帮助我感谢您的所有意见。

@ grek40这里是主APP WPF中的代码,我从我的MenuWindow添加上下文。 此MainWindow WPF APP具有默认XAML。

public MainWindow()
    {
        InitializeComponent();
        menuProgram = new MenuProgram();//User Control
        sw = new SharedWindow();//WPF window
        this.Close();
        sw.Content = menuProgram.Content;// here I set context
        sw.ShowDialog();
    }

和XAML:

<Window x:Class="Client.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Client"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>

</Grid>
</Window>

包含您的更改的整个代码:

    public partial class MainWindow : Window
{
    private SharedWindow sw;
    private MenuProgram menuProgram;

    public MainWindow()
    {
        InitializeComponent();
        menuProgram = new MenuProgram();
        SetForContext();
    }
    private void SetForContext()
    {
        sw = new SharedWindow();
        this.Close();
        sw.Content = menuProgram;
        sw.ShowDialog();
    }

1 个答案:

答案 0 :(得分:1)

您需要将UserControl设置为Content窗口,而不是Content的{​​{1}}:

UserControl

您的sw.Content = menuProgram;// here I set context /* Bad: sw.Content = menuProgram.Content; */ 已分配给DataContext本身,因此,如果您将UserControl树移至其他Content,则该Parent树将不再具有旧版DataContext }}