在datacontext之外将数据绑定到类的实例

时间:2018-08-10 13:50:26

标签: c# wpf datacontext revit

下面的答案。

因此,我正在使用c#和WPF为Autodesk Revit创建外部命令(外接程序)。 我有这样的东西:

我的视图包含:

PWM = new PrintWindowModel(); // this is my ViewModel           
        InitializeComponent();
        DataContext = PWM;

我的 ViewModel 包含用于获取和设置数据的属性。因此,我的数据绑定这一部分工作正常。它还包含以下内容(Revit的入口点):

public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
PrintMgr PrintManager = new PrintMgr(commandData);       
  //...
         return Result.Succeeded;
        }

PrintMgr是我从Revit SDK获得的一个类。这是一个非常有用的类,但是需要将commandData传递给工作。它使用commandData设置当前文档等。因为它需要commandData,所以我在这里没有其他选择。

现在,在我的Xaml中,有一个组合框:

<ComboBox Name="AllPrinters"                     
                  DisplayMemberPath="Name"
                  ItemsSource="{Binding GetInstalledPrinters}"                      
                  SelectedItem="{Binding PrintManager.PrinterName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

现在,ItemsSource可以正常工作了。没问题。

问题出在SelectedItem.上,我绑定它的方式显然不起作用。 (仅供参考:PrintManager.PrinterName确实具有get&set属性。)

现在,如果我的班级不需要commandData,我可以去

private PrintMgr _printManager;
Public PrintMgr PrintManager 
{ 
get{return_printManager;}
set { _printManager=value;}
}

但是由于我的班级需要commandData,所以这无济于事。

编辑:

我添加了:

public string PrinterName 
{
get { return PrintManager.PrinterName; } 
set { PrintManager.PrinterName = value; } 
}

以及在我的Xaml中:

SelectedItem="{Binding PrinterName} 

然后我删除了datacontext=this;并将PrintWndow.Datacontext=this;添加到命令方法中。

1 个答案:

答案 0 :(得分:0)

您仍然需要在ViewModel中添加PrintManager属性,但是我建议您添加一个私有的setter。

private PrintMgr _printManager;
public PrintMgr PrintManager 
{ 
    get{return_printManager;}
    private set { _printManager=value;}
}

在ViewModel命令处理程序中:

public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
     PrintManager = new PrintMgr(commandData);

     //...
     return Result.Succeeded;
}

这将在每次执行命令时更新您的属性。

但是我认为这不是您的最终答案,因为您仍然需要考虑如果多次执行该命令怎么办:是否要每次重新生成PrintManager?

如果在渲染视图之前未执行命令,则绑定将不起作用,因为PrintManager属性将为null。

在这种情况下,我还有另一种解决方案:)