ดำเนินการคำสั่ง usercontrol จาก viewmodel

ฉันมี usercontrol พร้อมคำสั่ง สิ่งที่ฉันต้องการทำคือรันคำสั่งนี้จาก ViewModel ของมุมมองที่มี

นี่จะสำเร็จได้ง่ายในโค้ดเบื้องหลัง เนื่องจากฉันสามารถไปที่ "UserControl.MyCommand.Execute" ได้ แต่แน่นอนว่าฉันต้องการทำสิ่งนี้ใน ViewModel

ตามทฤษฎีแล้ว สิ่งที่ฉันต้องการทำคือผูกคำสั่งของ UserControl กับคำสั่งบน ViewModel ซึ่งฉันสามารถดำเนินการได้ จากนั้น UserControl จะถูกจัดการ บางสิ่งเช่นนี้:

...
<local:MyControl
         MyCommand="{Binding ViewModelsCommand}" />
...

แน่นอนว่าสิ่งนี้จะส่งผลตรงกันข้ามกับสิ่งที่ฉันต้องการทำ เนื่องจากตอนนี้ ViewModelsCommand ถูกผูกไว้กับ MyCommand แล้วจะกลับด้านได้อย่างไร?

โดยพื้นฐานแล้วฉันต้องการผูกบางสิ่งเช่นนี้:

ViewModelsCommand="{ผูก MyControl.MyCommand}"

ยินดีรับแนวคิดหรือแรงบันดาลใจใดๆ ฉันไม่เห็นโหมดการเชื่อมโยงที่จะอนุญาตให้ฉันทำสิ่งนี้ได้ และฉันไม่แน่ใจว่าจะเข้าถึงคุณสมบัติของ DataContext สำหรับการผูกได้อย่างไร (โดยปกติแล้วคุณจะผูกและจัดการสิ่งนี้แบบสองทาง แต่แน่นอนว่าใช้ไม่ได้ในสถานการณ์นี้)

ขอบคุณล่วงหน้า.


person Chris Nicol    schedule 30.08.2010    source แหล่งที่มา
comment
คุณสร้างอินสแตนซ์/วางสายมุมมองและโมเดลมุมมองของคุณอย่างไร   -  person Jay    schedule 30.08.2010
comment
เพื่อประโยชน์ของตัวอย่างนี้ ... มุมมองเพิ่งถูกประกาศใน XAML (รูทซึ่งเป็นหน้าต่าง) มุมมองโมเดลจะถูกสร้างอินสแตนซ์ในตัวสร้างของมุมมอง   -  person Chris Nicol    schedule 31.08.2010


คำตอบ (3)


คุณกำลังสร้างอินสแตนซ์ของโมเดลมุมมองในตัวสร้างของมุมมอง

ทำไมไม่กำหนดมูลค่าให้ชัดเจนตอนก่อสร้างล่ะ?

 public SomeView()
 {
      var viewModel = new SomeViewModel();
      viewModel.ViewModelCommand = MyCommand; // or = myControl.MyCommand

      DataContext = viewModel;
 }

เป็นไปได้ ที่จะใช้การเชื่อมโยงกับ OneWayToSource, TwoWay หรือ Explicit แต่คุณยังต้องอัปเดตแหล่งที่มาอย่างชัดเจนอย่างน้อยหนึ่งครั้งในโค้ด (เสมอหากคุณใช้ Explicit)

myControl.GetBindingExpression(MyControl.MyCommandProperty).UpdateSource();
person Jay    schedule 31.08.2010
comment
เจย์ ฉันชอบแนวทางนี้ และฉันจะนำไปใช้กับปัญหาปัจจุบัน อย่างไรก็ตาม ฉันยังคงต้องการแก้ปัญหาด้วยการผูกมัด มันต้องเป็นไปได้และฉันเชื่อว่ามันจะเป็นแนวทางที่สะดวกถ้าทำได้ - person Chris Nicol; 01.09.2010
comment
@Chris ฉันอัปเดตคำตอบพร้อมข้อมูลเพิ่มเติมเกี่ยวกับการใช้การเชื่อมโยง - person Jay; 01.09.2010

ฉันใช้ EventAggregator ของ PRISM หรือ Messenger ของ MVVMLight เพื่ออนุญาตให้ ViewModels สองตัวพูดคุยได้ แต่กรณีของคุณดูแตกต่างออกไปเล็กน้อยเมื่อคุณมีมุมมอง (UserControl) พูดคุยกับ ViewModel

person JoshVarga    schedule 31.08.2010
comment
ใช่แล้ว และสิ่งที่ฉันต้องการทำให้สำเร็จนั้นไม่จำเป็นต้องมีระดับความซับซ้อนที่จะเพิ่มเข้ามาโดยใช้บางอย่างเช่น Messenger ฉันไม่ได้บอกว่า Messenger นั้นซับซ้อน เพียงแต่ว่าโดยพื้นฐานแล้วฉันต้องการส่งคำสั่งไปตามแผนผังภาพ - person Chris Nicol; 31.08.2010

โปรดทราบว่าคำตอบต่อไปนี้ไม่ถูกต้อง ดูเหมือนว่า OneWayToSource จะอัปเดตหลังจากมีการเปลี่ยนแปลงคุณสมบัติเป้าหมายเท่านั้น อย่างไรก็ตาม ฉันจะไม่ลบคำตอบนี้เพื่อแจ้งให้ผู้อื่นที่ไม่ตระหนักถึงพฤติกรรมนี้ (เช่นฉัน)

คำตอบเก่า (ดูข้อความด้านบน)

IMO ตัวอย่างของคุณควรใช้งานได้ (หาก MyControl.MyCommand เป็นทรัพย์สินสาธารณะที่ส่งคืน ICommand) คุณได้ลองใช้ BindingMode OneWayToSource แล้วหรือยัง?

<local:MyControl 
         MyCommand="{Binding ViewModelsCommand,Mode=OneWayToSource}" /> 
person HCL    schedule 30.08.2010
comment
ใช่ ฉันมี แต่เมื่อฉันทำ ฉันจะได้รับ MyCommand คือ ViewModelsCommand ซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการให้ ViewModelsCommand เป็น MyCommand นั่นสมเหตุสมผลไหม? ขออภัยหากอธิบายเรื่องนี้ไม่ดี - person Chris Nicol; 31.08.2010
comment
ฉันประหลาดใจกับพฤติกรรมนี้ คุณได้ตรวจสอบว่าคุณมีรหัสทดสอบเก่าอยู่ในโค้ดหลังหรือที่ตำแหน่งอื่นที่แทนที่การเชื่อมโยงนี้หรือไม่? อาจเป็น Binding ที่ประกาศเป็นโค้ดหรือแม้แต่การมอบหมายแบบคงที่? หากนี่ไม่ใช่ปัญหา ให้สร้างและแนบตัวแปลงค่าที่ไม่ทำอะไรเลยนอกจากส่งกลับค่าอินพุต จากนั้นตั้งค่าเบรกพอยต์ในวิธีการแปลงทั้งสองวิธี หลังจากนั้นจะเห็นว่าวัตถุใดถูกย้ายจากที่หนึ่งไปยังอีกที่หนึ่งเมื่อใด ฉันไม่มีความคิดอื่น เท่าที่ฉันเข้าใจ การผูกมัดจะต้องทำสิ่งที่คุณต้องการอย่างแน่นอน ไม่ใช่สิ่งที่ตรงกันข้าม - person HCL; 31.08.2010
comment
@HCL แหล่งที่มาจะได้รับการอัปเดตก็ต่อเมื่อคุณสมบัติเป้าหมายเปลี่ยนแปลง ซึ่งจะไม่อัปเดตอีกต่อไป เท่าที่ฉันรู้ OneWayToSource ไม่ได้ตั้งค่าแหล่งที่มาเมื่อถูกผูกไว้ในตอนแรก - person Jay; 31.08.2010
comment
ขออภัย HCL เจย์พูดถูก OneWayToSource ใช้ไม่ได้กับฉันในลักษณะนี้ ฉันพยายามคิดหาวิธีที่จะอธิบายสิ่งนี้ให้ดีขึ้น แต่ฉันคิดว่าโดยพื้นฐานแล้วมันเป็นคำสั่ง Daisy Chaining?!?! - person Chris Nicol; 31.08.2010
comment
@Jay และ @Chris Nicol: ขอบคุณ ฉันไม่รู้เรื่องนี้ (ชัด :) ฉันจะลบโพสต์ของฉันภายในไม่กี่นาทีเพื่อไม่ให้คนอื่นไปในทิศทางที่ผิด - person HCL; 31.08.2010
comment
@HCL ฉันจะทิ้งมันไว้ เป็นแนวทางที่สมเหตุสมผล คนอื่นอาจสงสัยว่าทำไมไม่ทำอย่างนั้น - person Jay; 31.08.2010
comment
ขอขอบคุณที่ไม่ลบ HCL ซึ่งเป็นความพยายามที่ดี ฉันดีใจที่มันอยู่ที่นั่นเพื่อความชัดเจนและเพื่อช่วยเหลือผู้อื่น - person Chris Nicol; 01.09.2010