下面的答案。
因此,我正在使用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;
添加到命令方法中。
答案 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。
在这种情况下,我还有另一种解决方案:)