C# 如何在框架模式MVVM中关联TreeView和DataGrid?
我使用Caliburn.Micro和a,希望在框架模式MVVM中与TreeView和DataGrid建立关系。TreeView具有层次结构,我希望它会突出显示,树项将成为DataGrid的itemsource。但是TreeView没有SelectedItem属性 我有两个模型合同和产品C# 如何在框架模式MVVM中关联TreeView和DataGrid?,c#,wpf,mvvm,treeview,caliburn.micro,C#,Wpf,Mvvm,Treeview,Caliburn.micro,我使用Caliburn.Micro和a,希望在框架模式MVVM中与TreeView和DataGrid建立关系。TreeView具有层次结构,我希望它会突出显示,树项将成为DataGrid的itemsource。但是TreeView没有SelectedItem属性 我有两个模型合同和产品 pubcli class Contarct() { public Contract() { ProductItems = new BindableCollection<
pubcli class Contarct()
{
public Contract()
{
ProductItems = new BindableCollection<Product>();
}
private string _contractName;
private string _firmName;
private BindableCollection<Product> _productItems;
}
public class Prodcut()
{
public Product()
{
Children = new BindableCollection<Product>();
}
private string _productName;
private string _contractName;
private string _serialNumber;
private string _markNumber;
private string _xrayNumber;
}
pubcli类Contarct()
{
公共合同()
{
ProductItems=新的BindableCollection();
}
私有字符串_contractName;
私有字符串_firmName;
私有BindableCollection\u productItems;
}
公共类Prodcut()
{
公共产品()
{
Children=新的BindableCollection();
}
私有字符串“\u productName”;
私有字符串_contractName;
私有字符串_serialNumber;
私有字符串_markNumber;
私有字符串xrayNumber;
}
还有一个类ContractService
public class ContractService
{
public ContractService()
{
Childrens = new BindableCollection<Product>
{
new Product{ProductName = "Comp1", SerialNumber = "SN123456", Children = null },
};
Products = new BindableCollection<Product>
{
new Product {ProductName = "Comp2", SerialNumber = "SN123456", Children = Childrens },
};
Contracts = new BindableCollection<Contract>
{
new Contract {ContractName = "Alfa" , ProductItems = Products},
};
}
//commands
public void GetData(Action<BindableCollection<Contract>,Exception>callback)
{
callback(Contracts, null);
}
public void _addnewContract()
{
Contracts.Add(new Contract {ContractName = "Test" });
}
public void _removeContarct(Contract contr)
{
Contracts.Remove(contr);
}
public Contract FindContarct(Contract contr)
{
if (contr == null)
return null;
return Contracts.FirstOrDefault(Contracts => Contracts.ContractName == contr.ContractName);
}
}
公共类合同服务
{
公共服务
{
Childrens=新的BindableCollection
{
新产品{ProductName=“Comp1”,SerialNumber=“SN123456”,Children=null},
};
产品=新的BindableCollection
{
新产品{ProductName=“Comp2”,SerialNumber=“SN123456”,Children=Childrens},
};
合同=新的BindableCollection
{
新合同{ContractName=“Alfa”,ProductItems=Products},
};
}
//命令
public void GetData(Actioncallback)
{
回调(合同,空);
}
public void_addnewContract()
{
添加(新合同{ContractName=“Test”});
}
公共无效_removeContarct(合同控制)
{
合同。移除(控制);
}
公共合同签订合同(合同控制)
{
如果(contr==null)
返回null;
返回Contracts.FirstOrDefault(Contracts=>Contracts.ContractName==contr.ContractName);
}
}
视图模型
public class MainViewModel : PropertyChangedBase
{
private readonly ContractService _contractService;
public MainViewModel(ContractService contractService)
{
_contractService = contractService;
_contractService.GetData(
(items, error) =>
{
contract = items;
});
}
public void contract_SelectedItemChanged(Contract sender, RoutedPropertyChangedEventArgs<object> e)
{
_contractService.FindContarct(sender);
}
public BindableCollection<Contract> contract { get; set; }
public void AddNewContract()
{
_contractService._addnewContract();
}
public void RemoveContract()
{
_contractService._removeContarct(SelectedContract);
}
private Contract _selectedContract;
public Contract SelectedContract
{
get { return _selectedContract; }
set
{
_selectedContract = value;
NotifyOfPropertyChange("SelectedContract");
NotifyOfPropertyChange(() => CanRemoveContract);
}
}
public bool CanRemoveContract
{
get
{
if (SelectedContract == null)
return false;
var findContract = _contractService.FindContarct(SelectedContract);
if (findContract == null)
return false;
return true;
}
}
public类主视图模型:PropertyChangedBase
{
私有只读合同服务_合同服务;
公共主视图模型(ContractService ContractService)
{
_合同服务=合同服务;
_contractService.GetData(
(项目、错误)=>
{
合同=项目;
});
}
public void contract\u SelectedItemChanged(contract sender,routedproperty changedeventargs e)
{
_contractService.FindContarct(发送方);
}
公共BindableCollection约定{get;set;}
public void AddNewContract()
{
_contractService._addnewContract();
}
公共无效删除合同()
{
_合同服务。\u删除CONTARCT(选定合同);
}
私人合同(选择合同);;
公共合同选择合同
{
获取{return\u selectedContract;}
设置
{
_选择合同=价值;
财产变更通知(“选定合同”);
财产变更通知(()=>可以解除合同);
}
}
公共图书馆可以解除合同
{
得到
{
如果(SelectedContract==null)
返回false;
var findContract=\u contractService.findContract(SelectedContract);
如果(findContract==null)
返回false;
返回true;
}
}
及
为什么您不能订阅TreeView的SelectedItemChanged事件并在那里更新您的DataGrid?您尝试了什么?如果您可以提供代码的相关部分,会容易得多。我添加了他们项目的示例。我尝试将DataGrid项资源=“{Binding ElementName=SelectedContract,Path=contract}”,我试图通过SelectedItemChanged,但都没有成功。强烈影响了一些编程经验
<Grid>
<WrapPanel>
<TreeView ItemsSource="{Binding contract}" MinWidth="200"
cal:Message.Attach="[Event SelectedItemChanged]=[Action contract_SelectedItemChanged($this,$eventArgs)]"
>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Contract}" ItemsSource="{Binding ProductItems}">
<TextBlock Text="{Binding ContractName}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Product}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding ProductName}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
<DataGrid ItemsSource="{Binding contract}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedContract}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ContractName}" Header="Имя контракта" ></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding ProductName}" Header="Имя продукта" ></DataGridTextColumn>
<DataGridTextColumn></DataGridTextColumn>
<DataGridTextColumn></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>